【问题标题】:Specifying Fetch mode for JPA Typed query为 JPA 类型化查询指定 Fetch 模式
【发布时间】:2013-07-18 04:04:02
【问题描述】:

我正在使用 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 的所有对象,“Select * from tableC”。但是当我使用 typedQuery 时,它会触发 n 个选择查询来获取 C 的 n 个对象。我如何确保它通过一个 select 语句获取所有元素。我只是举了一个 A 类和 B 类的例子来展示在其他场景中我可以通过一个 select 语句获取 B 的所有元素。

【问题讨论】:

  • 当你说“当我使用 typedQuery”时,它指的是createQuery("FROM C", C.class)?它会通过唯一ID生成多个select的sql吗?那你能把那个hql生成的sql贴出来吗?
  • 是的,它指的是createQuery。稍后我会发布 select 语句。

标签: hibernate jpa fetch jpql subquery


【解决方案1】:

您可以使用 JPQL 获取语法:

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

这将产生一个带有连接语句的 SQL 来填充您的 listB 关系。

distinct 关键字是必需的,否则你会得到 A 的重复项

【讨论】:

  • 假设我不希望在获取 listA 时填充 B 列表。我将在需要时填充 listB,我现在可以这样做。我的要求是仅使用单个 SELECT 获取 A 对象列表。我怎样才能做到这一点?
  • 也就是懒惰抓取,需要设置@OneToMany(mappedBy="objectA", cascade=CascadeType.ALL, fetchType = LAZY)
  • 我已经编辑了我的问题,以使其清楚。我不想与 B 类对象有任何关系。
【解决方案2】:

A 和 C 之间没有关系,C 是一个只有 1 个属性且没有连接的表。如果你想从 A 获得 C,你必须将它与 A 连接起来,并在 A 中提供类似于 List&lt;B&gt; listB 的变量。所以它在你的 A 类中变成了 List&lt;C&gt; listCC sinlgeC 之类的东西

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2014-12-10
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多