[英]SQL Query with Entity Manager
我一直在考慮如何針對我的目的創建適當的查詢,但是我不確定應該如何處理它。 這是一個Spring網絡應用程序,該網站類似於Twitter。
我正在嘗試從要求該功能的用戶那里獲取消息。 簡短地說,是Twitter時間軸,其中包括以下類:
用戶類別
//Imports
@Entity
@Table (name = "USUARIOS")
public class UsuarioVO implements Serializable {
//Not important class attributes and their getters/setters
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "USER_FOLLOW",
joinColumns = @JoinColumn(name = "FOLLOWED_ID"),
inverseJoinColumns = @JoinColumn(name = "FOLLOWER_ID"))
public Set<UsuarioVO> getFollowers() {
return followers;
}
public void setFollowers(Set<UsuarioVO> followers) {
this.followers = followers;
}
public void addFollower(UsuarioVO user) {
followers.add(user);
user.following.add(this);
}
@ManyToMany(mappedBy = "followers")
public Set<UsuarioVO> getFollowing() {
return following;
}
public void setFollowing(Set<UsuarioVO> following) {
this.following = following;
}
public void addFollowing(UsuarioVO user) {
user.addFollower(this);
}
}
訊息類別
@Entity
@Table(name = "MENSAJES")
public class MensajeVO implements Serializable{
/**
*
*/
private static final long serialVersionUID = 2819136255644301650L;
private Long id;
private UsuarioVO sender;
private String body;
private Date fecha;
private HashtagVO hashtag;
public MensajeVO() {}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "ID_SENDER")
public UsuarioVO getSender() {
return sender;
}
public void setSender(UsuarioVO sender) {
this.sender = sender;
}
@Column(name = "BODY")
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "FECHA_ENVIO")
public Date getFecha() {
return fecha;
}
public void setFecha(Date fecha) {
this.fecha = fecha;
}
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_HASHTAG")
public HashtagVO getHashtag() {
return hashtag;
}
public void setHashtag(HashtagVO hashtag) {
this.hashtag = hashtag;
}
}
我認為的第一種方法是從用戶那里獲取Set of following,並查詢其中的每一個以檢索消息,但是這樣做有一個問題,我想按日期對查詢進行排序,而該方法只能按給每個用戶的消息加上日期,例如:
我當時正在考慮使用內部聯接進行此操作,但不確定如何構建查詢。 工作查詢的示例:
public Set<MensajeVO> findByUser(Long userid) {
Query query = this.entityManager.createQuery(
"SELECT m FROM MensajeVO m WHERE m.sender.id = ?1 ORDER BY m.fecha DESC", MensajeVO.class);
query.setParameter(1, userid);
return new HashSet<MensajeVO>(query.getResultList());
}
提前致謝。
編輯
在SQL中,這是查詢
SELECT * FROM
mensajes
INNER JOINuser_follow
ON mensajes.ID_SENDER = user_follow.FOLLOWED_ID WHERE user_follow.FOLLOWER_ID =嗎?
但是我不知道如何在Java中獲取user_follow,因為這是ManyToMany字段。
弄清楚了,將其發布以防萬一:
Query query = this.entityManager.createQuery(
"SELECT m FROM MensajeVO m WHERE EXISTS(SELECT 1 FROM UsuarioVO u JOIN u.followers fr WHERE fr.id = ?1) OR m.sender.id = ?2 ORDER BY m.fecha DESC", MensajeVO.class);
query.setParameter(1, userid);
query.setParameter(2, userid);
搜索人員在用戶之后發送的消息或用戶發送的消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.