Criteria APIを使用した3列以上のin句作成 #968
-
目的:3列以上のin句を実現したい。相談内容いつもお世話になっております。
上記のように、3つ以上の列を条件としたin句を、可能であればCriteria APIのEntityqlを用いて作成したいのです。 DomaのCriteria API入門記事やサンプル、JavaDocを参照してみたのですが、1列に対するin句や、Tuple2を使用した2列に対するin句しか見つけることが出来ませんでした。 Criteria APIでの作成が不可能な場合、
のどちらかで対応したいと考えておりますが、何分頻繁に登場するため、可能であればCriteria APIを使用した実装を行いたいです。 動作環境
|
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 7 replies
-
残念ながら3列に対するIN句はサポートしていません。 Employee_ e = new Employee_();
Tuple3<Integer, Integer, String> t1 = new Tuple3<>(1, 10, "a");
Tuple3<Integer, Integer, String> t2 = new Tuple3<>(2, 20, "b");
List<Tuple3<Integer, Integer, String>> list = Arrays.asList(t1, t2);
List<Employee> result =
entityql
.from(e)
.where(c -> {
for (Tuple3<Integer, Integer, String> t : list) {
c.and(() -> {
c.or(() -> c.eq(e.employeeId, t.getItem1()));
c.or(() -> c.eq(e.employeeNo, t.getItem2()));
c.or(() -> c.eq(e.employeeName, t.getItem3()));
});
}
})
.fetch(); Criteira APIを使った上記のクエリは次のようなSQLに変換されます。 select
t0_.EMPLOYEE_ID, t0_.EMPLOYEE_NO, t0_.EMPLOYEE_NAME, t0_.MANAGER_ID, t0_.HIREDATE, t0_.SALARY, t0_.DEPARTMENT_ID, t0_.ADDRESS_ID, t0_.VERSION
from
EMPLOYEE t0_
where
((t0_.EMPLOYEE_ID = 1) or (t0_.EMPLOYEE_NO = 10) or (t0_.EMPLOYEE_NAME = 'a'))
and
((t0_.EMPLOYEE_ID = 2) or (t0_.EMPLOYEE_NO = 20) or (t0_.EMPLOYEE_NAME = 'b')) |
Beta Was this translation helpful? Give feedback.
残念ながら3列に対するIN句はサポートしていません。
代替手段としては、ANDやORを組み合わせて表現が可能です。