gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:12:38 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com