Java 做一个;在;使用Hibernate进行查询

Java 做一个;在;使用Hibernate进行查询,java,hibernate,orm,jpa,jpql,Java,Hibernate,Orm,Jpa,Jpql,我有一个字符串中的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)); }

我有一个字符串中的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();
String idsText=“380,382,386”;
ArrayList ID=新的ArrayList();
对于(字符串i:idsText.split(“,”))
{
id.add(Long.getLong(i));
}
List items=TrackedItem.find(“id IN(?),ids.fetch();
但这是失败的:
JPAQueryException发生:从models.TrackedItem执行查询时出错,其中(?):java.util.ArrayList中的id不能转换为java.lang.Long


如何使中的
部分正常工作?谢谢。

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

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


如果您不幸使用了较旧的非JPA hibernate,这应该适合您:

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();
Query Query=session.createQuery(“从TrackedItem项中,item.id位于(:items)”中);
query.setParameterList(“items”,Arrays.asList(380L,382L,386L));
@抑制警告(“未选中”)
List results=query.List();

即使查询执行正确,如果查询参数包含太多值,也可能会遇到错误

如果您使用的是Hibernate 5.1或更高版本,那么这个问题的一个可能解决方案就是使用Session.ByMultipleId()


有关更多信息,请参见

Long。getLong(i)
不会做您认为它会做的事情。改用
Long.parseLong(i)
。查看ids列表应设置为,query.setParameterList(“ids”,idsList);not query.setParameter(“ids”,ids)如何将字符串[]数组1设置为查询参数在我的情况下,我必须将setParameterList与类型参数一起使用才能使其正常工作:
.setParameterList(“ids”,ids,BigIntegerType.INSTANCE)
不幸?更老的与JPA相比,o_o裸Hibernate具有更多的功能(例如,参见Aleksandar Radulović的答案)。另外,您的答案似乎与公认的答案是重复的..在我编写这个简单的hibernate时,需要xml映射和注释。此外,已接受的答案经过编辑,与我的答案相符。随着时间的推移,很多事情都会发生变化。裸体Hibernate在你回答之前几年就有了注释:),但这与答案并不矛盾(只与你最后的评论相矛盾)。我只是不明白XML映射如何被认为是“不幸的方式”,因为它更灵活、更干净。顺便说一句,被接受的答案自第一个版本以来没有太大变化-方法的名称是错误的,但这值得一提。我添加此答案的主要原因是为了纠正错误的方法名称,但即使这在被接受的答案中得到了修复,我认为展示如何使用hibernate api获取此列表仍然很有用。也许是这样,但是query.getResultList()与query.list()的比较仍然很有用。如果自2015年以来情况有所改变,我将继续删除我的答案。
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();
SELECT c
FROM Customer c
WHERE c.status = :stat
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();
session
    .byMultipleIds(TrackedItem.class)
    .multiLoad(1L, 2L, 3L);