我的问题是关于这种查询:
select * from SOMETABLE where SOMEFIELD in ('STRING1','STRING2');
Run Code Online (Sandbox Code Playgroud)
以前的代码在Sql Developer中工作正常.相同的静态查询也可以正常工作,并返回一些结果;
Query nativeQuery = em.createNativeQuery(thePreviousQuery,new someResultSet());
return nativeQuery.getResultList();
Run Code Online (Sandbox Code Playgroud)
但是当我尝试参数化时,我遇到了一个问题.
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();
Run Code Online (Sandbox Code Playgroud)
我没有结果(但在控制台没有错误).当我查看日志时,我看到了这样的事情:
select * from SOMETABLE where SOMEFIELD in (?)
bind => [STRING1,STRING2]
Run Code Online (Sandbox Code Playgroud)
我也尝试不使用引号(具有类似结果)或非有序参数(:selectedValues),这会导致这样的错误:
SQL Error: Missing IN or OUT parameter at index:: 1
Run Code Online (Sandbox Code Playgroud)
我最终试图直接在参数中设置括号,而不是查询,但这也不起作用......
我可以在运行时构建我的查询,以匹配第一个(工作)情况,但我宁愿以正确的方式执行; 因此,如果有人有想法,我会非常感兴趣地阅读它们!
仅供参考:JPA版本1.0 Oracle 11G
我们正在尝试为本机sql查询动态生成IN子句以返回JPA实体.Hibernate是我们的JPA提供者.我们的代码看起来像这样.
@NamedQuery(
name="fooQuery",
queryString="select f from Foo f where f.status in (?1)"
)
....
Query q = entityManager.createNamedQuery("fooQuery");
q.setParameter(1, "('NEW','OLD')");
return q.getResultList();
Run Code Online (Sandbox Code Playgroud)
这不起作用,in子句不识别通过这种方式传递的任何值.有谁知道这个问题的解决方案?