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