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

 清宫佳伶330 发布于 2023-01-30 10:08

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

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 Oracle 11G

1 个回答
  • JPA仅支持在JPQL查询中使用集合作为列表文字参数,而不是在本机查询中.一些JPA提供程序支持它作为专有功能,但它不是JPA规范的一部分(请参阅/sf/ask/17360801/).

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

    使用适用于Oracle的JDBC驱动程序的Hibernate支持这两种功能.

    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();
    

    2023-01-30 10:10 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有