OpenJPA は次の where sql 部分を生成します
WHERE (t3.USERNAME = ? AND CAST(1 AS INTEGER) <> CAST(1 AS INTEGER)
AND t5.USERNAME IS NOT NULL AND 1 = 1 AND 1 = 1 AND 1 = 1)
いくつかのテーブルに参加しただけで、ついに参加しました
Join<SomeEntity, User> userJoin = someJoin.join(SomeEntity_.user);
Path<String> usernamePath = userJoin.get(User_.username);
CriteriaBuilder cb = getCb();
Predicate usernamePredicate = cb.equal(usernamePath, username);
JPAがデータベースに送信するSQLの奇妙な部分は
CAST(1 AS INTEGER) <> CAST(1 AS INTEGER)
この式は常に偽になります。したがって、ユーザーが選択されることはありません。
わかりました、また
1 = 1 AND 1 = 1 AND 1 = 1
式は非常に奇妙ですが、データベースのクエリ オプティマイザーはそれらを削除する必要があります。
- OpenJPA によって生成された同じまたは類似の奇妙な SQL ステートメントを持っている人はいますか?
- OpenJPA がこのような奇妙なステートメントを生成する理由を誰か (できれば OpenJPA 開発者の誰か) 教えてもらえますか?
研究は進む
今日、OpenJPA 2.2.1 ソース コード内でステートメントが生成されている場所を見つけました。デバッグ セッションのスクリーンショットを撮り、興味深い場所をマークしました。