1

这是关于获取文档的查询。该文件有两种邀请类型。

 ->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 outer join document_user_map on document.id= document_user_map.document_id and document_user_map.user_id =648

但是通过hibernate,我在方法中添加了以下标准,但只获得了有限的招标而不是其他标准。

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

任何人都可以在我错的地方帮助我。

编辑: 用户 id 1 应该只得到文档 1、2 而不是 3。但是通过这个标准,我没有得到 docid 1。

表结构:文档

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

此表中添加的受限文档用户条目:document_user_map

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

1 回答 1

1

问题通过CriteriaSpecification.LEFT_JOIN. 创建Alias时,它将执行内部连接,并且当连接为空时它不获取数据。所以在这里我完成了左加入别名。它将检查受邀用户。

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 回答