sql - 如何在 JPA 命名查询的 IN 子句中使用动态参数?

标签 sql oracle jpa oracle11g

我的问题是关于这种查询:

select * from SOMETABLE where SOMEFIELD in ('STRING1','STRING2');

之前的代码在 Sql Developer 中运行良好。
相同的静态查询也可以正常工作并返回一些结果;
Query nativeQuery = em.createNativeQuery(thePreviousQuery,new someResultSet());
return nativeQuery.getResultList();

但是当我尝试参数化它时,我遇到了一个问题。
final String parameterizedQuery = "select * from SOMETABLE where SOMEFIELD in (?selectedValues)";
Query nativeQuery = em.createNativeQuery(parameterizedQuery ,new someResultSet());
nativeQuery.setParameter("selectedValues","'STRING1','STRING2'");
return nativeQuery.getResultList();

我没有得到任何结果(但控制台中没有错误)。
当我查看日志时,我看到了这样的事情:
select * from SOMETABLE where SOMEFIELD in (?)
bind => [STRING1,STRING2]

我还尝试不使用引号(结果相似)或无序参数(:selectedValues),这会导致这样的错误:
SQL Error: Missing IN or OUT parameter at index:: 1

我最终尝试将括号直接设置在参数中,而不是查询中,但这也不起作用......

我可以在运行时构建我的查询,以匹配第一个(工作)案例,但我宁愿以正确的方式进行;因此,如果有人有想法,我会非常感兴趣地阅读它们!

供引用 :
JPA 1.0 版
甲骨文 11G

最佳答案

JPA 仅在 JPQL 查询中支持将集合用作列表文字参数,而不在 native 查询中使用。一些 JPA 提供者支持它作为专有特性,但它不是 JPA 规范的一部分(参见 https://stackoverflow.com/a/3145275/1285097)。

native 查询中的命名参数也不是 JPA 规范的一部分。它们的行为取决于持久性提供程序和/或 JDBC 驱动程序。

Hibernate with JDBC driver for Oracle 支持这两个特性。

List<String> selectedValues = Arrays.asList("STRING1", "STRING2");
final String parameterizedQuery = "select * from SOMETABLE where SOMEFIELD in (:selectedValues)";
return em.createNativeQuery(parameterizedQuery)
         .setParameter("selectedValues", selectedValues)
         .getResultList();

关于sql - 如何在 JPA 命名查询的 IN 子句中使用动态参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21484176/

相关文章:

java - 我可以使用 Mapstruct 创建 Java 对象/实体的 DeepCopy 吗?

java - 把Spring中的JpaRepository暴露给客户端可以吗?

mysql - 上次数据mysql中的组条件

MySQL 使用带有 2 个查询、子查询或连接的 select?

java - JPA 2 中@Embeddable 上的@PostLoad?

mysql - 从 Oracle 到 MySQL 的数据传输

sql - customer.pk_name加入transaction.fk_name与customer.pk_id [串行]加入transaction.fk_id [整数]

sql - 如何在 RIGHT JOIN 中聚合具有不同 AND 子句的字段?

java - 表达式语言到 SQL where 子句的转换?

c# - ORA-08103 程序错误