SSブログ

JPAを使っているソースの改変でハマった [プログラミング]

SQLと銘打たれている変数の中に入れたクエリが、SQLじゃなくJPQLだったという結末。

asとかも書いていないし、なんかSQLとは違うなぁと思っていて、その中のSQLを発行してもテーブルが見つからないとか言われて、実際DBの中にはテーブルもその中のカラムもどこにもなかった。その代わり、ソースの中にはカラム名の変数が存在していてなんだ?と思った。SQLっぽいクエリで、Javaの変数の中身をいじっているのかと思ったら、果たしてそうであった。

http://itdoc.hitachi.co.jp/manuals/link/cosmi_v0870/APKC/EU070347.HTM

いろいろ探してきてJPAのクエリでありそうなことはなんとなくわかっていたけれども、上のサイトの

JPQLは,データベースを検索・更新したり,データベースが持っている集合関数などの機能を利用したりするためのクエリ言語です。SQLがテーブルを対象としたクエリ言語であるのに対して,JPQLはエンティティクラスを対象としたJPA仕様で定義されているクエリ言語です。


で確信できた。というかなんもわからない状態からこういう基礎的な情報を探るのって結構大変だ。作った人がある程度レクチャーしてくれれば検索しやすいものの、何が悪いかわからない所でエラーが出ていたりすると、エラーメッセージでググるみたいな遠回しな方法でしか調べられないのがきつい。

ここを見るとDBとJavaのクラスが繋がっていて、いわゆるORマッパーみたいなことをしているようだった。こういうのを見ると便利になっているのかなっていないのかよくわからん。

https://terasolunaorg.github.io/guideline/public_review/ArchitectureInDetail/DataAccessJpa.html

ただライブラリやフレームワークを使う時には初期学習コストは往々にしてあるもので、学んだ後は比較的楽ができるから、使わない手はない。後から直すにしてもこれが何者なのかがわかっている分だけマシである。オレオレシステムは後から手を出そうとすると痛い目を見ることになる。




実際のエラーメッセージで問題となったのは

Caused by: org.hibernate.QueryException: Legacy-style query parameters (`?`) are no longer supported; use JPA-style ordinal parameters (e.g., `?1`) instead


でJPQLの古い書き方らしくて、?の中にパラメーターを埋め込めるようになっていたが、今では?1とか?2とか数を付けてあげないといけなかった。この仕組みが良く分からず、ググってもなかなか出てこない。そりゃGoogleの仕組みでは"?1"とかでググっても出てこないわな。Googleは記号を混ぜて検索すると無視する傾向にあるからね。技術者泣かせというか。


ここは?1に変えることで回避できたんだけど、他のところで別の問題が出た。

org.springframework.dao.InvalidDataAccessApiUsageException: Could not locate ordinal parameter [1], expecting one of []; nested exception is java.lang.IllegalArgumentException: Could not locate ordinal parameter [1], expecting one of []


と同じエラーがネストして出てきた。

Could not locate ordinal parameter [1], expecting one of [];
が何を言っているのか分からなかったんだけど、QueryインタフェースのsetParameterメソッドで設定している時に、?の後ろの数とパラメータの位置をしているするところがズレるというか、ないところに入れようとするときに出てくるらしい。パラメータで置換するときに入れるところがないのでエラーが出ていたっぽい。

先ほども書いたけど下のサイトを見ると良く分かる。
http://itdoc.hitachi.co.jp/manuals/link/cosmi_v0870/APKC/EU070347.HTM

JPAというかSpringというかHibernate関連であろうことはわかったんだけど、
Could not locate ordinal parameter [1], expecting one of [];
でググっても日本語サイトがほとんど出てこないし、英語で書いてあるページも的を射ていることを言っているところがあったのかもしれないがわからなかった。

英語力が不足しているというのもあるけれども、そもそものJPAとかSpringの知識が圧倒的に不足しているところが問題なのかなと思ったり。というかエラーもそうだけれども、ソースが示している事案がどのフレームワークやライブラリに属しているかとかもう門外漢にはわけわからんね。




言語のバージョンが変わるマイグレーション作業は、昔と今の言語やライブラリの違いが判らないといけない上に、元々のソースの書き方がどうなっているかを勘案しないといけないからしんどいね。一からスクラッチするのとまた違った面倒くささがある。自分で書いたものなら大まかな部分は覚えているので検討がつけやすいけど、多くは他の人の書いたものを改修しないといけないので、周りから攻めないといけないのがちょっとしんどい。

にしてもJPAで使うにあたって、SQLにそんなに変わらないけど、SQLとしては投入できないJPQLみたいなものを作るのかよくわからない。DSLは便利だけど、覚える方としては大きなお世話である場合が多い気はする。そういう意味ではRubyの内部DSLとかはコストが少ないのかなと思ったりもする。

タグ:Java
コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0