2011-01-05 9 views
2

私はテーブルを持っています - これはAAAと呼ばれ、追加のテーブルに1対多の定義を持ち、BBBが割り当てられています。それはそのようになります。メインレコードからのリストベースのレコードへのアクセス

public class AAA 
{ 
... 
    @OneToMany(orphanRemoval=true, fetch=FetchType.LAZY, mappedBy="aaa") 
    private List<BBB> bbbs; 
... 
} 

は、私は私に1 BBBs以上のものを持っているすべてのAAASを与えるJPAクエリを実行したいので、私はSIZE(aaa.bbbs)を使用しました。しかし、私は結果セットが各aaaの最初のbbbのタイムスタンプによって順序付けされることを望みます。

実際の例:自分のプロフィールに追加した最新の写真で注文したすべてのFacebook友だちを取得したいと思います。この場合のAAAは「フレンド」であり、BBBは「ピクチャ」になり、Picture.CreatedTimestampで友達を注文したいと考えています。

私は基本的に、各aaaのbbbsの最初の項目にアクセスし、それによって注文する必要があります。その目標を達成するためには何をすべきか?最新のタイムスタンプを見つけるために、1のサイズを決定し、他にする - あなたは休止状態を使用している場合

答えて

1

だから、あなたがbbbs上の2つの集合体を必要とするフィルタ(@Filterと@FilterDef)を使用することができます。 JOINGROUP BYで表現できます。

SELECT a 
FROM AAA a JOIN a.bbbs b 
GROUP BY a.id, a.column1, a.column2 
HAVING COUNT(b) > 1 
ORDER BY MAX(b.timestamp) DESC 
+0

構文は正しいですか? 「GROUP BY」はJPAでは機能しません。 MySQLではPostgreSQLを使用していて、汎用JPAソリューションを探しています。 –

+0

@Eldad: 'GROUP BY'はJPAで動作します。これは完全に有効なJPAクエリです。 – axtavt

+0

JPAのドキュメントをさらにチェックすると、正しいと思われますが、実際には動作しません(私はHibernateを使用しています)。あなたのクエリを使用しようとすると例外が発生します: "エラー:列" aaa.some_aaa_column "は、GROUP BY句に表示するか、集計関数で使用する必要があります"。 –