3

给定以下为 a 烹制的 Oracle sql 查询PreparedStatement

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会变成substringANY保持原样。在 JPQLANY中需要一个子查询。

如何将列表更改为子查询?或者我应该使用IN运算符还是应该生成一个包含一堆 OR 条件的 JPQL 字符串?

甲骨文 10gR2
Java 5
JPA 2

4

1 回答 1

7

考虑到这= ANY(...)相当于IN (...)在 SQL 中,您可以安全地使用 IN。

实际上,IN谓词是根据谓词定义的ANYSQL 1992标准的摘录:

8.4 <在谓词中>

[...]

<in predicate> ::=
    <row value constructor>
      [ NOT ] IN <in predicate value>

[...]

2) 令RVC 为<row value constructor>,令IPV 为<in predicate value>。

[...]

4) 表达式

  RVC IN IPV

相当于

  RVC = ANY IPV  

再一次,ANY/SOME <quantified comparison predicate>运算符的定义方式类似于一堆OR连接的谓词。因此答案是:您可以同时使用INOR连接谓词。

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

于 2012-05-07T11:57:54.460 回答