为什么不使用getEntityManager()。createNativeQuery支持IN子句

时间:2015-10-30 15:40:30

标签: java jpa eclipselink

我使用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为什么不起作用。

2 个答案:

答案 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"

此致