Hibernate 指定JPA类型查询的获取模式

Hibernate 指定JPA类型查询的获取模式,hibernate,jpa,fetch,jpql,subquery,Hibernate,Jpa,Fetch,Jpql,Subquery,我正在使用JPA和Hibernate3.6。我试图批量从数据库中获取结果,减少hibernate中的选择次数。在我的类A中,有一个类B的对象列表。我已经指定了fetchMode,并且只使用一个Select来获取B的所有对象 public class A { @OneToMany(mappedBy="objectA", cascade=CascadeType.ALL) @Fetch(FetchMode.SUBSELECT) List<B> listB =

我正在使用JPA和Hibernate3.6。我试图批量从数据库中获取结果,减少hibernate中的选择次数。在我的类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的所有对象,“从tableC中选择*”。但是当我使用typedQuery时,它会触发n个select查询来获取C的n个对象。如何确保它通过一个select语句获取所有元素。我刚刚给出了一个类A和类B的示例,以显示在其他场景中,我可以通过一个select语句获得B的所有元素

您可以使用JPQL获取语法:

List<A> listA = em.createQuery("select distinct a from A a join fetch a.listB",
                  A.class).getResultList();
List listA=em.createQuery(“从连接获取a.listB中选择不同的a”,
getResultList();
这将导致一个SQL with join语句来填充listB关系


distinct关键字是必需的,否则您将获得A的重复项A和C之间没有关系,C是一个只有1个属性且没有联接的表。如果你想从A中得到C,你必须把它和A连接起来,并在A中给出类似于
List listB
变量的东西。所以它变成了类似于
List listC
csinlgec
的东西,在你的类A中,比如说我不想在得到listA时填充B的列表。我将在需要时填充listB,我现在可以这样做。我的要求是只需通过一次选择获取对象列表。如何实现这一点?这就是所谓的延迟抓取,您需要设置
@OneToMany(mappedBy=“objectA”,cascade=CascadeType.ALL,fetchType=lazy)
我已经编辑了我的问题,以澄清问题。我不想与B类对象有任何关系。当你说“当我使用typedQuery”时,它指的是
createQuery(“从C”,C.class)
?它将生成多个sql,按唯一ID选择?那么,您可以发布该hql生成的sql吗?是的,它引用createQuery。我将在某个时间发布select语句。
public class C {
        int varC;
    }
List<A> listA = em.createQuery("select distinct a from A a join fetch a.listB",
                  A.class).getResultList();