4

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

式は非常に奇妙ですが、データベースのクエリ オプティマイザーはそれらを削除する必要があります。

  1. OpenJPA によって生成された同じまたは類似の奇妙な SQL ステートメントを持っている人はいますか?
  2. OpenJPA がこのような奇妙なステートメントを生成する理由を誰か (できれば OpenJPA 開発者の誰か) 教えてもらえますか?

研究は進む

今日、OpenJPA 2.2.1 ソース コード内でステートメントが生成されている場所を見つけました。デバッグ セッションのスクリーンショットを撮り、興味深い場所をマークしました。

拡大1 : http://i.stack.imgur.com/LBmzM.png

ここに画像の説明を入力

4

1 に答える 1