SQL-запрос с Entity Manager - PullRequest
       2

SQL-запрос с Entity Manager

1 голос
/ 30 июня 2019

Я думал о том, как создать правильный запрос для своих целей, но я не уверен, как мне подойти к нему. Это веб-приложение Spring, веб-сайт похож на 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, упорядоченные по дате
  • и т.д ..

Я думал об этом с помощью Inner Join, но я не уверен, как мне построить запрос. Пример рабочего запроса:

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

Заранее спасибо.

EDIT

В SQL это запрос

SELECT * FROM mensajes INNER JOIN user_follow ON mensajes.ID_SENDER = user_follow.FOLLOWED_ID ГДЕ user_follow.FOLLOWER_ID =?

Но я не знаю, как получить user_follow в Java, так как это поле ManyToMany.

1 Ответ

0 голосов
/ 30 июня 2019

Разобрался, выложил на всякий случай, если кому-нибудь это поможет:

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

Поиск сообщений, отправленных людьми, за которыми следит пользователь, или сообщений, отправленных пользователем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...