2015-08-25 2 views
1

У меня есть эти классы:JPA многие ко многим Query

Chatroom класса: класс

@Entity 
public class ChatRoom { 

    @Column(name="chatroom_id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long chatroomId; 

    @ManyToMany(fetch=FetchType.EAGER) 
    @JoinTable(
     name="CHATROOM_USER", 
     joinColumns = {@JoinColumn(name="chatroom_id",referencedColumnName="chatroom_id")}, 
     inverseJoinColumns={@JoinColumn(name="user_id",referencedColumnName="user_id")} 
    ) 
    private Set<User> users; 

    @OneToMany(mappedBy="chatroom", cascade=CascadeType.PERSIST, orphanRemoval=true) 
    private Set<ChatRoomMessage> messages; 
} 

Пользователь:

@Entity 
public class User { 
    @Id 
    @Column(name="user_id", length=40, unique=true, updatable=false) 
    private String userId; 
} 

ChatRoomMessage класс:

@Entity 
public class ChatRoomMessage { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long messageId; 

    @ManyToOne(optional=false) 
    @JoinColumn(name="session_id", nullable=false) 
    private User sender; 

    @ManyToOne(optional=false) 
    @JoinColumn(name="chatroom_id", nullable=true) 
    private ChatRoom chatroom; 
} 

Если я хочу, чтобы все сообщения, отправленные пользователем модуля я сделал это в DAO:

MessagesDAO класса:

@Repository 
public class MessageDaoImpl implements MessageDaoI { 
    @Override 
    public List<ChatRoomMessage> getMessages(User u){ 
     Criteria c = sessionFactory.getCurrentSession().createCriteria(ChatRoomMessage.class, "cmessage"); 
     c.createAlias("cmessage.sender", "sender"); 
     c.add(Restrictions.eq("sender", u)); 
     return c.list(); 
    } 
} 

Проблема начинается тогда, когда я пытаюсь кодировать следующие запросы:

  1. Получить все сообщения в чате, отправленные или полученные пользователем.
  2. Получить все сообщения в чате, отправленные или полученные пользователем в чате.

Не могли бы вы дать идеи о том, как решить запросы ?.

+0

_ «Проблема начинается ...» _ Какая проблема? –

+0

Проблема, которую я имею в виду, заключается в структурировании критериев для запросов. – lennin92

ответ

0

Вы можете написать запрос, как показано ниже:

Первый запрос:

Query query = session.createQuery("from ChatRoomMessage as c JOIN c.sender where c.sender.userId = :senderUserId"); 
query.setString("senderUserId", "SENDER_USER_ID_TO_BE_SEARCHED"); 
List list = query.list(); 

Второй запрос:

Query query = session.createQuery("from ChatRoomMessage as c JOIN fetch c.chatroom where c.chatroom.users.userId = :senderUserId"); 
query.setString("senderUserId", "SENDER_USER_ID_TO_BE_SEARCHED"); 
List list = query.list(); 

Надежда это решает вы выдаете.

+0

Привет, эти запросы будут работать, если они будут рассматривать только отправителя, но; они оба должны рассмотреть вопрос о том, ** ** отправлен ** или ** получен ** пользователем ChatroomMessage пользователем. – lennin92

+0

Какое свойство поддерживается, если сообщение получено или отправлено? –

+0

chatroommessage отправляется пользователем (свойство «отправитель» в классе chatroommessage) и отправляется в чат (свойство «chatroom» в классе chatrooommessage), класс chatroom содержит набор пользователей (от многих до многих отношений) пользователи в чате должны получить сообщение (chatroommessage) – lennin92

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