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

Loï*_*oni 5 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();
Run Code Online (Sandbox Code Playgroud)

Loï*_*oni 1

虽然我仍然无法解释为什么为 in 子句中提供的每个 ID 生成查询(在我原来的问题中提供),但我在此博客上找到了此问题的解决方案(https://thoughts-on-java.org /fetch-multiple-entities-id-hibernate/)。解决方案包括使用 Hibernate 的会话 API,如下所示:

//get session object from entity manager
Session session = em.unwrap(Session.

MultiIdentifierLoadAccess<A> multiLoadAccess = session.byMultipleIds(A.class);
List<A> aObjects= multiLoadAccess.withBatchSize(1000).multiLoad(idList);
return aObjects;
Run Code Online (Sandbox Code Playgroud)