给出了PreparedStatement
的以下Oracle sql查询:
SELECT *
FROM my_table
WHERE field1 = 'foo'
and field2 =ANY (substr( ? , 1, 2) || '00000000',
substr( ? , 1, 4) || '000000',
substr( ? , 1, 6) || '0000',
substr( ? , 1, 8) || '00',
?
)
我想翻译成JPQL查询。阅读JPQL文档后,substr
变为substring
并且ANY
保持原样。在JPQL ANY
期望子查询。
如何将列表更改为子查询?或者我应该使用IN
运算符还是应该生成带有一堆OR条件的JPQL字符串?
Oracle 10gR2
Java 5
JPA 2
答案 0 :(得分:6)
考虑到= ANY(...)
等同于SQL中的IN (...)
,您可以安全地使用IN。
实际上,IN
谓词是根据ANY
谓词定义的。摘录SQL 1992标准:
8.4< in predicate>
[...]
<in predicate> ::= <row value constructor> [ NOT ] IN <in predicate value>
[...]
2)设RVC为&lt;行值构造函数&gt;并且让IPV为&lt; in谓词值&gt;。
[...]
4)表达式
RVC IN IPV
相当于
RVC = ANY IPV
然后,ANY
/ SOME
<quantified comparison predicate>
运算符的定义方式类似于一堆OR
个连接谓词。因此答案是:您可以同时使用IN
或OR
- 连接的谓词。
注意:虽然这个答案解释了它们在SQL中的作用,但我很确定类似的东西也适用于JPQL。