我使用的是Spring Data JPA,但我一直纠结于如何根据用户的聊天历史创建查询。
我有两个对象,其中Message是一个实体,而Chat Message不是。
您可以从这两个类中查看,并指导我如何创建spring数据JPA查询,该查询查询某些用户与其他用户的对话:
@Entity
public class Message {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
Long id;
String message;
@ManyToOne
@JoinColumn(name="fromUser",nullable=false)
private User fromUser;
@ManyToOne
@JoinColumn(name="toUser",nullable=false)
private User toUser;
public Message() { }
public Message(User fromUser, User toUser, String message) {
this.fromUser=fromUser;
this.toUser=toUser;
this.message=message;
}
public Long getId() {
return id;
}
// getters and setters
}
public class ChatMessage {
Long id;
String message;
String sender;
String username;
Long senderId;
public ChatMessage() { }
// getters and setters
public ChatMessage(Message m, Boolean isReply) {
this.sender = m.getFromUser().getFirstname() + " " + m.getFromUser().getLastname();
this.message = m.getMessage();
this.senderId = m.getFromUser().getId();
this.id = m.getId();
}
}
我可能的终点:
@RequestMapping(value="/conversations",produces = "application/json")
@ResponseBody
public List<Message> myMessages(Principal principal){
String thisUser=principal.getName();
User user=userServiceImpl.findByUsername(thisUser);
// List<Message>messages=messageServiceImpl.finddAll();
List<Message> messages=messageServiceImpl.fetchMessages(user.getId());
return messages;
}
请注意,ChatMessage只是一个用于承载WebSocket消息的对象类。我的消息回购:
public interface MessageRepository extends JpaRepository<Message,Long>{
}
图片:[1]:https://i.stack.imgur.com/hVbP3.png
这里还不清楚您到底需要什么,例如messageServiceImpl
做什么。但是,也许这将是有用的:
public interface MessageRepository extends JpaRepository<Message, Long> {
// if we get all messages your user sent or received - would it be
// what you mean here a "conversation" ?
List<Message> findByFromUserIdOrToUserId(Long id);
// or you can use @Query to achieve the same
@Query("select m from Message m where m.fromUser.id = :id or m.toUser.id = :id")
List<User> findMessagesForUser(Long id);
}
您还可以在他们的官方文档中找到有关如何使用SpringData创建查询的更多详细信息。