【问题标题】:Returning result from 3 tables using JPA criteria使用 JPA 标准从 3 个表返回结果
【发布时间】:2015-09-10 03:17:56
【问题描述】:

我有以下情况:

@Entity
public class Period
{
    String Name;
}

@Entity
public class Bill
{
    Period period;

    @OneToMany(mappedBy = "bill", fetch = FetchType.LAZY)
    private List<Entry> entry = new ArrayList<Entry>(0);
}

@Entity
public class Entry
{
    @NotNull
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "BILL_ID", nullable = false)
    Bill bill;

    String text;

    BigDecimal amount;
}

所以我需要的是在单个查询中获取所有数据,根是 BillEntry 使用 JPA 2.0 标准(Hibernate 后面)。我已经阅读了几篇关于此问题的帖子HEREHERE,似乎我无法在结果中使用子查询或获取两级深度的数据。

编辑:为了让我的问题更清楚:当我使用Entry 作为根时,我无法获取Period,当我使用Bill 作为根时,我无法获取Entry 中的所有其他表.此外,我不能使用 Eager fetch,因为还有其他用例需要这些表。

还有其他方法吗?

谢谢!

【问题讨论】:

  • 如果您也可以发布 HQL 或 SQL 来完成您想要完成的工作,这将有所帮助。
  • 如果您将获取类型更改为eager,它将获取它,具体取决于您的 HQL
  • 我对这些表有不同的用例,我不能在这里使用earger

标签: java hibernate jpa-2.0 criteria


【解决方案1】:

要从关联中获取数据,请使用left join fetch clauses

select distinct b from Bill b 
left join fetch b.period 
left join fetch b.entry
where b...

select distinct e from Entry e 
left join fetch e.bill b 
left join fetch b.period
where e...

关于 Criteria,它的fetch() 方法返回一个 Fetch,它本身有一个方法 fetch() 返回一个 Fetch(),它本身有一个方法 fetch() 返回一个 Fetch,等等。所以是的,它支持尽可能多你想要的水平。

【讨论】:

  • 但是当我的根是Entry 时,如何从Bill 获取Period
  • 请阅读整个问题。我还需要类型安全的 JPA 标准。
  • 请自行尝试。 Criteria 也有 fetch。您只需翻译上述查询即可。
  • 我在上面要说的一点是,JPA 似乎没有能力获取任何更深的级别,在您的示例中e.b.period period 属性是第二级。
  • JPA 不是休眠的,你的例子不是标准,它的 HQL。
猜你喜欢
  • 2013-06-13
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2015-06-18
  • 1970-01-01
相关资源
最近更新 更多