我的问题是关于这种查询:
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
JPA仅在JPQL查询中支持在列表中使用集合作为列表文字参数,而在本机查询中则不支持。一些JPA提供程序将其作为专有功能来支持,但它不是JPA规范的一部分(请参阅https://stackoverflow.com/a/3145275/1285097)。
本机查询中的命名参数也不是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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句