我使用eclipse链接作为JPA,Oracle作为DB使用。我在java中使用getEntityManager()。createNativeQuery。在我的查询中,我想使用IN子句,但它不起作用,也没有例外。
来自页面用户将输入传递为336885,56239,895423
示例查询
"select emp_name from emp where emp_id in ( ?id)"
query.setParameter("id", empBO.getEventIds());
我使用Java来转换使用split和concat
336885,56239,895423 to '336885','56239','895423'
但这对我没用。
我知道如果我们使用 JPQL 这对我有用。选择Native的原因是避免为表创建Model对象。
我使用了JPQL查询,因为我需要快速提供代码。我已经尝试了第二个答案,发布在这里。但没有结果。当我有空闲时间时,我会再次尝试IN为什么不起作用。
答案 0 :(得分:1)
这不适用于JPA的原因与为什么这不能直接与JDBC一起工作的原因相同 - 它缺乏JDBC对多值参数的支持。
当JPQL处理器看到in (?id)
时,它会将其转换为其底层SQL引擎可以“理解”的表达式 - 通常看起来像这样:
WHERE emp_id IN (?id_0, ?id_1, ?id_2, ...)
JDBC支持此功能,因此无错误地执行。
如果您想执行本机查询,则需要自己进行此转换。从您拥有的模板开始,为您要发送的ID的数量插入问号,并将列表中的ID绑定到这些参数:
StringBuilder queryStr = new StringBuilder("select emp_name from emp where emp_id in (");
int[] ids = empBO.getEventIds();
for (int i = 0 ; i != ids.length() ; i++) {
queryStr.append("?id_");
queryStr.append(i);
}
queryStr.append(")");
... // Construct your query, then...
for (int i = 0 ; i != ids.length() ; i++) {
query.setParameter("id_"+i, ids[i]);
}
答案 1 :(得分:0)
您可以显示jpa的日志以查看代码中的请求。
log4j.logger.org.hibernate=info<BR>
或
<logger name="org.hibernate"><BR>
<level value="info"/> <BR>
</logger><BR>
您也可以在没有括号的情况下尝试:
&#34;从emp中选择emp_name,其中emp_id在?id&#34;
您确定?
吗?
"select emp_name from emp where emp_id in :id"
此致