2013-07-27 2 views
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" /> 

Пользователь может участвовать только те документы, которые открыты и получили приглашение для ограниченного типа.

я могу получить ожидаемый результат через ниже запроса:

выберите * из документа левое внешнее соединение document_user_map на document.id = document_user_map.document_id и document_user_map.user_id = 648

Но через спящий режим, я добавил ниже критерии по методу, но только ограничил торговлю не другими.

criteria.createAlias ​​("inviteUsers", "inviteUser"); Критерии.add (Restrictions.or (Restrictions.ne ("приглашениеType", InvitationType.LIMITED), Restrictions.or ( Restrictions.and (Restrictions.eq ("приглашениеType", InvitationType.LIMITED), Restrictions.eq ("inviteUser. id ", user.getId())), Restrictions.isNull (" inviteUsers "))));

Может кто-нибудь помочь мне, где я ошибаюсь.

Edit: идентификатор пользователя 1 должен получить только документ 1, 2, но не 3. но через эти критерии я не получаю DocId структуры 1.

Таблицы: документ

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

Limited запись пользователя документ добавлен в этой таблице: document_user_map

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

Непонятно, что вы ожидаете отсюда. – taxeeta

+0

@taxeeta редактировал вопросы .. дайте мне знать любой запрос. – iMBMT

ответ

1

Проблема решена через CriteriaSpecification.LEFT_JOIN. , когда Создано псевдоним, тогда он будет выполнять внутреннее соединение, и он не извлекал данные, когда объединение равно null. поэтому здесь я сделал левую присоединиться к псевдониму. и он будет проверять приглашенного пользователя.

criteria.createAlias ​​("inviteUsers", "inviteUser", CriteriaSpecification.LEFT_JOIN); Критерии.add (Restrictions.or (Restrictions.or (Restrictions.isNull ("приглашениеType"), Restrictions.ne ("приглашениеType", InvitationType.LIMITED)), Restrictions.and (Restrictions.eq ("приглашениеType", InvitationType. LIMITED), Restrictions.eq ("inviteUser.id", user.getId()))));

Смежные вопросы