分组并加入Hibernate和JPA

时间:2013-06-18 18:13:55

标签: hibernate jpa playframework

我有一些模型,它们之间有依赖关系。以下是模型:

@Entity
public class A extends Model {
    @Required
    public String name;

    @Required
    @ManyToOne(fetch = FetchType.LAZY)
    public C modelC;
}

@Entity
public class B extends Model {
    @Required
    public String name;
}

@Entity
public class C extends Model {
    @Required
    public Date lastUpdate;

    @Required
    @OneToMany(mappedBy = "modelC", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    public List<A> modelsA;

    @Required
    @ManyToOne(fetch = FetchType.LAZY)
    public B modelB;
}

正如您所见,名为C的模型包含多个名为A的模型和一个名为B的模型。

我想要做的是选择具有不同模型C(与B不同)且具有最大id的所有模型date(更接近当前日期)。另外,我想选择模型C的依赖项(A列表和模型B)。

我有查询加载所有模型C及其依赖项:

select distinct c from C c
left join fetch c.modelsA
left join fecth c.modelB

我想我只能检索不同的模型C(不同于模型B的id)及其与此查询的依赖关系:

select distinct c from C c
left join fetch c.modelsA
left join fetch c.modelB b
group by b.id

但是,如何检索具有最高日期的不同模型C?这不起作用:

select distinct c, max(c.lastUpdate) as maxUpdate from C c
left join fetch c.modelsA
left join fetch c.modelB b
group by b.id

你能帮助我吗?

以下是数据示例:

B(b1):
  name: First model of type B

B(b2):
  name: Second model of type B

C(c1):
  lastUpdate: 100
  modelB: b1

C(c2):
  lastUpdate: 200
  modelB: b2

C(c3):
  lastUpdate: 300
  modelB: b1

A(a1):
  name: A1
  modelC: c1

A(a2):
  name: A2
  modelC: c1

A(a3):
  name: A3
  modelC: c2

A(a4):
  name: A4
  modelC: c3

我想检索此c2c3及其依赖项。

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

你可以使用order By,而且使用hql你没有义务做左连接,join也是valide,因为获取利用率很高。

max(modelC.lastUpdate)也许试试这个或c.modelC.lastUpdate

例如

 query = "select u from User u "
+ "left join u.linkedAccounts linkedAccounts "
+ "where u.active =  true "
    + "and **linkedAccounts.providerKey** = :pProviderKey" ),