当前位置: 首页 > 面试题库 >

用Hibernate做一个“ IN”查询

万楷
2023-03-14
问题内容

我有一个字符串中的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();

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

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


问题答案:

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();

或(使用命名参数):

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();

以下是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

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



 类似资料:
  • 我的申请中有一个性能问题。 我有三个实体,其关系如下: 从数据库加载实体需要太多时间,orderLines加载的是急切加载,而Cards加载的是惰性加载。为了让应用流畅,懒惰加载是必要的。 我需要为一个案例配置即时加载,我需要帮助。 我正在使用jhsipster stack:spring boot和JPA 我试图编写Hql查询 我有un错误:意外的令牌订单(第2行) 我尝试了原生查询 但当我这么做

  • 问题内容: 我有一个servlet,它为用户做一些工作,然后减少用户的信用。当我实时查看数据库中的用户信用时,如果有来自同一用户的许多并发请求,则由于并发控制,信用被错误地扣除。假设我有一台服务器,并且数据库管理处于hibernate状态。我正在使用事务控制来处理整个请求,请参见代码以获取详细信息。我有几个问题: 当面对来自同一用户的多个并发请求时,为什么db中的信用计数器到处跳?为什么我的交易控

  • 数据库表 Project id name user_id 1 跳远 1,2,3,4,6,8,12.... 2 跳绳 21,43,13,14,26,38,92.... 字段user_id保存着用户表user中的id 现在做了一个管理系统,用户登录进来的时候系统会保存该用户的id 然后去查询该用户参加比赛的项目列表,如果参加了跳绳项目,就显示出跳绳选项。 第一个想到的就是先循环出project这个表,

  • 我想查询表的完整分区。我的复合分区键由组成和是字符串,是整数。 我需要将hour_of_timestamp字段添加到我的分区键,因为在摄取数据时存在热点。 现在我想知道查询数据的完整分区的最有效方法是什么?根据这个博客,使用会在协调器节点上造成大量开销。 使用TOKEN函数并用两个TOKEN查询分区是否更好?如<代码> SELECT * from my table WHERE TOKEN(id,d

  • 我正在使用hibernate映射来自mysql数据库的数据。 以下是我的查询: 并得到一个错误: Apache Tomcat/7.0.23-错误报告 键入异常报告 注意可获得根本原因的完整堆栈跟踪

  • 我有一个和这个问题很相似的问题。 我正在从表1中为表2中的字段3和字段4的所有匹配唯一组合选择所有数据。 我希望我的where子句类似于: 但这是Hibernate不允许的。 我已经尝试推出where子句,使其具有两个子查询,并根据结果检查field1和field2,但似乎子查询总是必须返回多列。我使用group by完成了这个操作,但是Hibernate会自动将group by中的列添加到投影列