Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA多对多查询_Java_Hibernate_Jpa_Jpa 2.0_Criteria - Fatal编程技术网

Java JPA多对多查询

Java JPA多对多查询,java,hibernate,jpa,jpa-2.0,criteria,Java,Hibernate,Jpa,Jpa 2.0,Criteria,我有以下课程: 聊天室课程: @Entity public class ChatRoom { @Column(name="chatroom_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private long chatroomId; @ManyToMany(fetch=FetchType.EAGER) @JoinTable( name="CHATROOM_USER",

我有以下课程:

聊天室课程:

@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;
}
@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;
}
@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();
    }
}
聊天室消息类:

@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;
}
@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;
}
@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();
    }
}
如果我想要用户发送的所有消息,我在DAO上做了如下操作:

MessagesDAO类:

@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;
}
@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;
}
@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();
    }
}
@存储库
公共类MessageDaoImpl实现MessageDaoI{
@凌驾
公共列表获取消息(用户u){
条件c=sessionFactory.getCurrentSession().createCriteria(ChatRoomMessage.class,“cmessage”);
c、 createAlias(“cmessage.sender”、“sender”);
c、 添加(限制条件,等式(“发送方”,u));
返回c.list();
}
}
当我尝试编写下一个查询代码时,问题就开始了:

  • 获取用户发送或接收的所有聊天室消息
  • 获取用户在聊天室上发送或接收的所有聊天室消息

  • 你能谈谈如何解决这些问题吗

    您可以按如下方式编写查询:

    第一个问题:

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

    希望这能解决您的问题。

    您可以编写以下查询:

    第一个问题:

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

    希望解决了你的问题。

    “问题开始……”哪个问题?我的意思是构造查询的标准。“问题开始了……”哪个问题?我的意思是构造查询的标准。你好,如果他们只考虑发送者,这些查询会起作用,但是;它们都需要考虑用户是否发送或接收聊天消息。如果消息被接收或发送,哪个属性保持?一个聊天信息由用户发送(CHATROOMMeX类上的属性“发送器”),并发送到聊天室(ChaloRoM消息类上的“聊天室”),聊天室类包含用户集。聊天室中的所有用户必须接收消息(ChaloMoMead)Hello,如果只考虑发送者,这些查询将工作,但是,它们都需要考虑用户是否发送或接收聊天信息。如果接收或发送消息,哪个属性维护?用户是否发送聊天信息。(chatroommessage类上的属性“sender”)并发送到聊天室(chatroommessage类上的属性“chatroom”),聊天室类包含用户集(多对多关系)。聊天室中的所有用户都必须接收该消息(chatroommessage)