在使用 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)
我是一名优秀的程序员,十分优秀!