java - JPA/Hibernate 似乎将带有 in 子句的查询转换为带有 = 子句的多个查询

标签 java oracle performance jpa

我们实现的解决方案是为了在合理的时间内收集大量重对象并且没有内存溢出(我说的是具有多个 fetchType.eager 关系的对象,对于本身具有急切关系的实体),是首先选择那些对象的id,然后根据这些id选择对象本身。

到了优化代码的时候,我们注意到(使用 hibernate.show_sql=true)我们用来收集这些对象的查询(select a from A a where a.id in :ids) 被 JPA/Hibernate 翻译成数千个形式为 select a from ...endless join list... where a.id = ?

的查询

问题如下:

为什么 JPA/Hibernate 将带有“in”子句的初始查询转换为带有“=”子句的如此多的查询。这不是低效的吗?如果是这样,有什么办法可以防止这种情况发生吗?

下面是在我们的代码中调用查询的方式:

    Query q = this.getContext().createQuery("select a from A a where a.id in :ids");
    q.setParameter("ids", idList);
    return (List<A>) q.getResultList();

最佳答案

您好,您应该使用 setParameterList而不是 setParameter。 如果你想获得完整的实体对象,也不需要在 hibernate 中使用 select

 Query q = this.getContext().createQuery("from A a where a.id in (:ids)");
q.setParameterList("ids", idList);
return (List<A>) q.getResultList();

关于java - JPA/Hibernate 似乎将带有 in 子句的查询转换为带有 = 子句的多个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55478359/

相关文章:

java - 如何获取 Bing Ads API 的开发人员 key

c# - 用另一种语言创建相同的函数

sql - 触发器将记录复制到相同表的正确 SQL 是什么?

c - Linux 上的磁盘 IO 模拟器

java - 多人 Java 游戏 - 通过 GUI 启动服务器时程序卡住

sql - NEXT_DAY 函数在 SQL 和 PL/SQL 中的工作方式不同吗?

SQL 合并行 - 字符串数据类型

java - 另一个应用程序中的 Activity 和服务之间的通信

c - 提高我的 C 列表 push_back 函数的性能

java - 使用 jaxb 解码生成的 Axis (包含多引用)soap 响应