有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

getEntityManager()中不支持java why-IN子句。createNativeQuery

我使用eclipselink作为JPA,使用Oracle作为DB。我正在使用getEntityManager()。java中的createNativeQuery。在我的查询中,我想使用In子句,但它不起作用,也没有例外

从第页,用户将输入作为33688556239895423传递

示例查询

"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这将对我有用。选择本机的原因是避免为表创建模型对象

更新

我使用了JPQL查询,因为我需要快速交付代码。我已经试过第二个答案了。但没有结果。当我有空的时候,我会再试一次为什么IN不工作


共 (2) 个答案

  1. # 1 楼答案

    这不适用于JPA的原因与不直接适用于JDBC的原因相同——JDBC中缺乏对多值参数的支持

    当JPQL processor看到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]);
    }
    
  2. # 2 楼答案

    您可以显示jpa的日志以查看代码中的请求

    log4j.logger.org.hibernate=info<BR>

    或者

    <logger name="org.hibernate"><BR>
      <level value="info"/> <BR>
    </logger><BR>
    

    您也可以尝试不使用括号:
    “从emp where emp_id in?id中选择emp_name”

    你确定?

    "select emp_name from emp where emp_id in :id"
    

    问候