2011-02-02 10 views
14

following question(JPA APIで書かれています)の解決策がhibernate criteria APIを使用して記述できるかどうか、どのように知っていますか?ElementCollection createAlias in hibernate API

私が(ユーザ名のリストです)参加者のリストが含まれているディスカッションエンティティを持っている。具体的に:

@ElementCollection 
@Column(name = "user_name") 
@CollectionTable(name = "DISCUSSION_USER", joinColumns = @JoinColumn(name = "DISCUSSION_ID")) 
@OrderColumn(name = "ORDER_INDEX") 
private List<String> participants = new ArrayList<String>(); 

今、私は与えられたユーザ名が参加しているすべての議論を取得する必要があります。

答えて

2

ことはできません。

代わりにOneToManyのElementCollectionを使用する場合の制限は、ターゲット・オブジェクトができないことです照会、永続化、親オブジェクトから独立してマージされます。それらは厳密に私的所有の(依存する)オブジェクトであり、埋め込みマッピングと同じです。 ElementCollectionにカスケードオプションはありません。ターゲットオブジェクトは、常に親と一緒に永続化、マージ、削除されます。

だから、私は代わりにOneToManyを使用しました。

1

あなたは私たちに多くを与えることができます...

Criteria crit = getSession().createCriteria(Discussion.class); 
    crit.createAlias("participants", "p"); 
    crit.add(Restrictions.eq("p.userName", portalUsername)); 

しかし、私は非エンティティとのエイリアスを作成することはできません:私は参加者のためのエンティティを作成していた場合は

これは簡単だろう完全なスキーマとクエリ?

また、Criteria APIは吸う。 QueryDSLを使用してみてください、あなたのクエリは次のようになります。同様に、私が何を望むかhereを説明

HibernateQuery q=new HibernateQuery(getSession()) 
.from(QDiscussion.discussion).from(QDocument.document) 
.where(QDocument.document.userName.in(QDiscussion.discussion.userNames)) 
.list(QDocument.document); 
24

後期回答。

@ElementCollectionによって注釈)コレクションの正しいプロパティ名は、"elements"又はCollectionPropertyNames#COLLECTION_ELEMENTS定数です。

が良い答えのために遅すぎることはありません、以下の回答

Criteria crit = getSession().createCriteria(Discussion.class); 
crit.createAlias("participants", "p"); 

crit.add(Restrictions.eq("p.elements", portalUsername)); 

またはその代わり

crit.add(Restrictions.eq("p." + CollectionPropertyNames.COLLECTION_ELEMENTS, portalUsername)); 
+1

定数COLLECTION_ELEMENTSを使用して試してみてください、私は一度申し訳ありませんが –

+0

これを試してみてくださいよdid not work ... dammit ....しかし、私は非常に古いリリースを使用していますが、これは新しいバージョンで修正されている可能性があります.. – Thihara

+0

これはHibernateのソースコードでこれらの定数を使用しているようですHQLクエリのみ。 –