【问题标题】:Hibernate uses initial WHERE clause in subsequent queriesHibernate 在后续查询中使用初始 WHERE 子句
【发布时间】:2009-03-30 20:05:43
【问题描述】:

在使用 Hibernate 的 JPA 实现时,我注意到一个有趣的优化行为。在同一事务中,初始 JPA 查询的 WHERE 子句用于涉及初始查询结果的后续查询。

例如,人有姓氏和一组拥有的书籍。

// (1) get person by last name
Query q = entityManager.createQuery("SELECT p FROM Person p WHERE p.firstName = :lastName");
q.setParameter("lastName", "Smith");
List<Person> persons = q.getResultList();

// (2) get books owned by some arbitrary person in persons
Person person = persons.get(n);
Collection<Book> books = person.books;

(1) 转换为 SQL:

SELECT ... FROM Person WHERE lastName = 'Smith'

当 (2) 运行并访问 Person 的书籍时,它会生成 SQL:

SELECT ... FROM Person_Book book0_ WHERE book0_.personId IN (SELECT ... FROM ... WHERE lastName = 'Smith')

不知何故,来自 (1) 的 WHERE 子句被记住并用于涉及检索到的人的后续查询 (2)。 Hibernate 中的这种行为是什么,我该如何配置它?

跟进:我在人的书上使用子选择。这解释了我看到的行为。

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    摘自this link:

    我要介绍的最后一种获取形式是子选择获取。子选择提取与我刚刚描述的批量大小控制提取非常相似,但将“数字复杂性”排除在外。子选择获取实际上是一种不同类型的获取策略,适用于集合样式关联。然而,与连接样式获取不同,子选择获取仍然与惰性关联兼容。不同之处在于,子选择获取只是像我的同事所说的那样获得“整个射击比赛”,而不仅仅是一批。也就是说,它使用subselect执行,将主实体集的ID集传递到关联表的select off中:

    从所有者中选择 *

    select * from pet where owner_id in (select id from owner)

    【讨论】:

      猜你喜欢
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 2021-11-16
      • 1970-01-01
      相关资源
      最近更新 更多