【问题标题】:SQL Query with Entity Manager使用实体管理器进行 SQL 查询
【发布时间】:2019-06-30 16:25:32
【问题描述】:

我一直在考虑如何为我的目的创建一个合适的查询,但我不确定我应该如何处理它。这是一个 Spring Web 应用,网站类似于 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;
    }
}

我认为的第一种方法是从用户那里获取关注集并查询每个人以检索消息,但是有一个问题,我想按日期对查询进行排序,使用这种方法会仅按日期排序每个用户的消息,例如:

  • 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 字段。

【问题讨论】:

    标签: java sql spring hibernate jpa


    【解决方案1】:

    想通了,贴出来以防万一:

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

    搜索用户关注的人发送的消息或用户发送的消息。

    【讨论】:

      猜你喜欢
      • 2016-07-02
      • 2015-01-30
      • 2014-09-13
      • 1970-01-01
      • 2011-11-23
      • 2018-10-28
      • 2013-05-24
      • 2019-10-06
      • 1970-01-01
      相关资源
      最近更新 更多