【发布时间】: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 中的这种行为是什么,我该如何配置它?
跟进:我在人的书上使用子选择。这解释了我看到的行为。
【问题讨论】: