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

Java Hibernate在后续查询中使用初始WHERE子句,java,hibernate,jpa,Java,Hibernate,Jpa,在使用Hibernate的JPA实现时,我注意到一个有趣的优化行为。在同一事务中,初始JPA查询的WHERE子句用于涉及初始查询结果的后续查询 例如,person有lastName和一组拥有的书籍 // (1) get person by last name Query q = entityManager.createQuery("SELECT p FROM Person p WHERE p.firstName = :lastName"); q.setParameter("lastName",

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

例如,person有lastName和一组拥有的书籍

// (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;
当运行2并访问个人的书籍时,它会生成SQL:

SELECT ... FROM Person_Book book0_ WHERE book0_.personId IN (SELECT ... FROM ... WHERE lastName = 'Smith')
不知何故,1中的WHERE子句被记住,并在涉及检索到的人的后续查询2中使用。Hibernate中的这种行为叫什么?我如何配置它

跟进:我正在使用subselect对个人的书籍进行筛选。这解释了我看到的行为。

摘自:

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

从所有者中选择*

从宠物中选择*从主人中选择id

摘自:

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

从所有者中选择*

从宠物中选择*从主人中选择id

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