我们实现了一种解决方案,以在合理的时间内收集大量重型对象且不会出现内存溢出问题(我说的是具有多个fetchType.eager关系的对象,这些对象本身又具有eager fetched关系的实体),首先选择这些对象的ids,然后基于这些ids选择对象本身。
在优化我们的代码时,我们发现(使用
在优化我们的代码时,我们发现(使用
hibernate.show_sql=true
)我们用来收集这些对象的查询语句(select a from A a where a.id in:ids
)被JPA / Hibernate转换为成千上万个查询语句,形式为select a from ...无尽的连接列表...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();