使用Hibernate执行"IN"查询

Amy*_*y B 33 java orm hibernate jpa jpql

我在String中有一个ID列表,并希望使用Hibernate来获取具有这些ID的行.TrackedItem是一个Hibernate/JPA实体(对不起,如果我在这里混淆命名).

我的代码是:

String idsText = "380, 382, 386";
ArrayList<Long> ids = new ArrayList<Long>();

for (String i : idsText.split(","))
{
    ids.add(Long.getLong(i));
}

List<TrackedItem> items = TrackedItem.find("id IN (?)", ids).fetch();
Run Code Online (Sandbox Code Playgroud)

但那失败了: JPAQueryException occured : Error while executing query from models.TrackedItem where id IN (?): java.util.ArrayList cannot be cast to java.lang.Long

如何使IN零件工作?谢谢.

Pas*_*ent 63

JPQL查询的语法不正确.使用(带位置参数):

List<Long> ids = Arrays.asList(380L, 382L, 386L);
Query query = em.createQuery("FROM TrackedItem item WHERE item.id IN (?1)");
query.setParameterList(1, ids)
List<TrackedItem> items = query.getResultList();
Run Code Online (Sandbox Code Playgroud)

或(使用命名参数):

List<Long> ids = Arrays.asList(380L, 382L, 386L);
Query query = em.createQuery("FROM TrackedItem item WHERE item.id IN :ids");
query.setParameterList("ids", ids)
List<TrackedItem> items = query.getResultList();
Run Code Online (Sandbox Code Playgroud)

下面是JPA 1.0规范中有关参数的相关部分:

4.6.4.1位置参数

以下规则适用于位置参数.

  • 输入参数由问号(?)前缀后跟整数指定.例如:?1.
  • 输入参数从1开始编号.
    请注意,在查询字符串中可以多次使用相同的参数,并且查询字符串中参数的使用顺序不必符合位置参数的顺序.

4.6.4.2命名参数

命名参数是以":"符号为前缀的标识符.它遵循第4.4.1节中定义的标识符规则.命名参数区分大小写.

例:

SELECT c
FROM Customer c
WHERE c.status = :stat
Run Code Online (Sandbox Code Playgroud)

第3.6.1节描述了用于绑定命名查询参数的API

  • 这是错的.用`IN:ids`替换`IN(:ids)`. (2认同)
  • ids 列表应设置为 , query.setParameterList("ids", idsList); 不是 query.setParameter("ids", ids) (2认同)

dep*_*her 10

如果你不幸使用旧的非JPA休眠,这应该对你有用:

Query query = session.createQuery("FROM TrackedItem item WHERE item.id IN (:items)");
query.setParameterList("items", Arrays.asList(380L, 382L, 386L));

@SuppressWarnings("unchecked")
List<TrackedItem> results = query.list();
Run Code Online (Sandbox Code Playgroud)