休眠5-使用NamedQuery而不使用@FetchMode(SUBSELECT)

时间:2018-06-28 16:17:07

标签: java hibernate jpa

我们在实体上使用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完成。这样可能吗?

谢谢。

0 个答案:

没有答案