【问题标题】:JPA Many To Many QueryJPA 多对多查询
【发布时间】:2015-08-25 21:02:55
【问题描述】:

我有这些课程:

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. 获取用户在聊天室发送或接收的所有聊天室消息。

您能否提供有关如何解决查询的想法?

【问题讨论】:

  • “问题开始了……”哪个问题?
  • 我的意思是构建查询的标准。

标签: java hibernate jpa jpa-2.0 criteria


【解决方案1】:

您可以编写如下查询:

第一个查询:

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();

希望这能解决您的问题。

【讨论】:

  • 你好,如果他们只考虑发件人,这些查询会起作用,但是;他们都需要考虑 ChatroomMessage 是由用户发送还是接收
  • 如果消息被接收或发送,哪个属性维护??
  • 聊天室消息由用户发送(chatrooommessage 类的属性“sender”)并发送到聊天室(chatrooommessage 类的属性“chatroom”),聊天室类包含用户集(多对多关系)聊天室中的所有用户都必须收到消息(chatroommessage)
猜你喜欢
  • 2016-01-31
  • 2018-05-14
  • 2020-03-29
  • 2018-10-31
  • 2016-06-03
  • 2011-03-08
  • 2015-05-05
  • 2014-04-08
相关资源
最近更新 更多