什么是JPQL中的SQL ANY运算符?

时间:2012-05-07 11:30:22

标签: java sql oracle hibernate jpa

给出了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

1 个答案:

答案 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个连接谓词。因此答案是:您可以同时使用INOR - 连接的谓词。

注意:虽然这个答案解释了它们在SQL中的作用,但我很确定类似的东西也适用于JPQL。