Hibernate 指定JPA类型查询的获取模式
我正在使用JPA和Hibernate3.6。我试图批量从数据库中获取结果,减少hibernate中的选择次数。在我的类A中,有一个类B的对象列表。我已经指定了fetchMode,并且只使用一个Select来获取B的所有对象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 =
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();