0

それらの間に依存関係があるいくつかのモデルがあります。モデルは次のとおりです。

@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の 1 つのモデルが含まれてい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このクエリでは、個別のモデル(モデルの id で区別B) とその依存関係のみを取得できると思います。

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

c2これとc3その依存関係を取得したいと思います。

ご協力ありがとうございました

4

1 に答える 1

0

order Byを使用できます。さらに、hqlを使用すると、左結合を行う必要はありません。結合も有効です。フェッチの使用に注意してください。

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" ),
于 2013-07-09T07:52:33.347 に答える