为JPA类型查询指定获取模式

时间:2013-07-19 00:51:41

标签: hibernate jpa fetch jpql subquery

我正在使用JPA和Hibernate 3.6。我试图从批处理中获取数据库的结果,减少了休眠中的选择数量。在我的A类中,有一个B类对象的列表。我已经指定了fetchMode,只有一个Select用于获取B的所有对象。

public class A {    
    @OneToMany(mappedBy="objectA", cascade=CascadeType.ALL)
    @Fetch(FetchMode.SUBSELECT)
    List<B> listB = new ArrayList<B>();
}
public class C {
    int varC;
}

我希望批量返回所有实例C,一个select语句来获取所有实例。我使用以下TypedQuery获取C对象列表。怎么做到呢 ?谢谢你的帮助。

List<C> listC = em.createQuery("FROM C", C.class).getResultList();

为了更清楚,我有以下C类。

public class C {
        int varC;
    }

我想获取C的所有对象,“从tableC中选择*”。但是当我使用typedQuery时,它会触发n个select查询来获取C的n个对象。我怎样才能确保它通过一个select语句获取所有元素。我刚刚给出了A类的示例,而B类在其他场景中展示了我能够通过一个select语句获取B的所有元素。

2 个答案:

答案 0 :(得分:1)

您可以使用JPQL提取语法:

List<A> listA = em.createQuery("select distinct a from A a join fetch a.listB",
                  A.class).getResultList();

这将导致一个带有join语句的SQL填充listB关系。

需要使用distinct关键字,否则您将获得A

的副本

答案 1 :(得分:0)

A和C之间没有关系,C是只有1个属性且没有连接的表。如果你想从A获得C,你必须将其与A一起加入并在A中提供类似List<B> listB变量的内容,以便在类A中变为List<C> listCC sinlgeC