簡體   English   中英

使用實體管理器進行SQL查詢

[英]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,並查詢其中的每一個以檢索消息,但是這樣做有一個問題,我想按日期對查詢進行排序,而該方法只能按給每個用戶的消息加上日期,例如:

  • 按日期排序的User1消息
  • 按日期排序的User2消息
  • 等等..

我當時正在考慮使用內部聯接進行此操作,但不確定如何構建查詢。 工作查詢的示例:

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 JOIN user_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM