gpt4 book ai didi

java - 为什么 getEntityManager().createNativeQuery 不支持 IN 子句

转载 作者:行者123 更新时间:2023-12-01 10:59:36 26 4
gpt4 key购买 nike

我使用 eclipse 链接作为 JPA,使用 Oracle 作为数据库。我在 java 中使用 getEntityManager().createNativeQuery 。在我的查询中,我想使用 IN 子句,但它不起作用,也没有异常(exception)。

从页面用户将输入传递为 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 不起作用。

最佳答案

这不能与 JPA 一起工作的原因与不能直接与 JDBC 一起工作的原因相同 - JDBC 缺乏对多值参数的支持。

当 JPQL 处理器看到 in (?id) 时,它会将其转换为其底层 SQL 引擎可以“理解”的表达式 - 通常如下所示:

WHERE  emp_id IN (?id_0, ?id_1, ?id_2, ...)

这是由 JDBC 支持的,因此执行时不会出错。

如果您想执行 native 查询,则需要自己进行此转换。从您拥有的模板开始,插入您要发送的 ID 数量的问号,并将列表中的 ID 绑定(bind)到这些参数:

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]);
}

关于java - 为什么 getEntityManager().createNativeQuery 不支持 IN 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33439757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com