gpt4 book ai didi

java - Hibernate 在后续查询中使用初始 WHERE 子句

转载 作者:太空宇宙 更新时间:2023-11-04 09:00:37 25 4
gpt4 key购买 nike

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

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

// (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 中的这种行为称为什么以及如何配置它?

跟进:我正在对某人的书籍使用子选择。这解释了我所看到的行为。

最佳答案

摘自this link :

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

select * from owner

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

关于java - Hibernate 在后续查询中使用初始 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/698822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com