1

ドキュメントの取得に関するクエリです。ドキュメントには 2 つの招待タイプがあります。

 ->OPEN : View all user
 ->LIMITED : Show to limited user

休止状態のマッピングは次のとおりです。

 <list name="invitedUsers" cascade="refresh" table="document_user_map">
 <key column="document_id"/>
 <index column="position" type="integer"/>
 <many-to-many class="com.v4common.shared.beans.usermanagement.User" column="user_id"/>
 </list>
 <property name="invitationType" column="invitation_type"  
 type="com.resources.userenum.UserEnumInvitationType" />

ユーザーは、公開されている文書のうち、種類が限定された招待状を受け取った文書のみに参加できます。

以下のクエリで期待される結果を得ることができます:

select * from document left outside join document_user_map on document.id= document_user_map.document_id and document_user_map.user_id =648

しかし、休止状態を介して、メソッドに以下の基準を追加しましたが、他ではなく限られた入札のみを取得しました。

criteria.createAlias("invitedUsers", "invitedUser"); criteria.add(Restrictions.or(Restrictions.ne("招待タイプ",InvitationType.LIMITED), Restrictions.or( ", user.getId())),Restrictions.isNull("invitedUsers"))));

私が間違っているところを誰か助けてもらえますか。

編集: ユーザー ID 1 はドキュメント 1、2 のみを取得する必要がありますが、3 は取得できません。しかし、この基準ではドキュメント ID 1 を取得できません。

テーブル構造:ドキュメント

id name invitation type userid
-----------------------------
1  doc1    open           1
2  doc2    LIMITED        1
3  doc3    LIMITED        2

このテーブルに限定された doc ユーザー エントリが追加されました: document_user_map

document_id user_id  position
---------------------------
2         1        0
3         2        0
4

1 に答える 1

1

問題は、を通じて解決されますCriteriaSpecification.LEFT_JOINエイリアスが作成されると、内部結合が実行され、結合が null の場合はデータがフェッチされませんでした。ここで、エイリアスで左結合を行いました。招待されたユーザーをチェックします。

criteria.createAlias("invitedUsers", "invitedUser",CriteriaSpecification.LEFT_JOIN); criteria.add(Restrictions.or(Restrictions.or(Restrictions.isNull("invitationType"), Restrictions.ne("invitationType",InvitationType.LIMITED)), Restrictions.and(Restrictions.eq("invitationType",InvitationType.LIMITED) ),Restrictions.eq("invitedUser.id", user.getId()))));

于 2013-07-27T09:00:56.183 に答える