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)