我们在实体上使用Hibernate @NamedQuery
批注,并使用联接访存来急切地在查询时检索我们想要的数据。我们大部分时间都在进行此操作,但是我们在某个关系上遇到的FetchMode.SUBSELECT
似乎无效。取而代之的是,似乎生成的查询仍在使用联接提取执行单个查询,而不是预期的第二个查询。
同样,我们使用的是Hibernate的@NamedQuery
,而不是JPA样式。
我们要在案例中使用SUBSELECT的原因是我们有多个@OneToMany
关系,并且我们希望避免Cartisean产品出现严重的性能问题
这是我们的设置:
@Entity
@NamedQueries(
@NamedQuery(
name = "StackOverflowNamedQuery",
query = "SELECT distinct f FROM Foo f "
+ "LEFT JOIN FETCH f.fooOneToMany bar " // This is a straight JOIN FETCH
+ "LEFT JOIN FETCH bar.barOneToMany " // WANT THIS TO DO A SUBSELECT
+ "LEFT JOIN FETCH f.manyToOne_boo "
+ "LEFT JOIN FETCH f.manyToOne_blah "
+ "WHERE f.id = :id "
+ "f.isRemoved = false"
)
)
然后在Bar.getBarOneToMany()上,这是我们为该OneToMany关系设置的注释设置
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "entity_id", referencedColumnName = "id")
@Fetch(FetchMode.SUBSELECT)
public Set<BarOneToMany> getBarOneToMany() {
return barOneToMany;
}
因此,基本上,我们希望通过连接获取来获取OneToMany中的一个,然后我们希望另一个由SUBSELECT完成。这样可能吗?
谢谢。