Witam wszystkich,
Mam pytanie dotyczące pobierania encji Hibernate. Załóżmy że posiadam model danych zgodny z poniższym kodem. W jaki sposób powinno wyglądać zapytanie służące do pobrania
wszystkich komentarzy które posiada User o wybranym ID oraz analogicznie wszystkich komentarzy Artykułu o wybranym ID? Generalnie chciałbym się dowiedzieć jaki jest najlepszy pattern na takie zapytania w którym dana encja (w tym przypadku Comment) jest wykorzystywana w różnego rodzaju innych enchach w relacji OneToMany z dołączoną tabelką. Czy ktoś może mi naświetlić rozwiązanie?
Przykładowe zapytanie w SQL wykonał bym w poniższy sposób:
SELECT * FROM COMMENT C JOIN ARTICLE_COMMENT CA ON CA.COMMENT_ID=C.ID JOIN ARTICLE A ON CA.ARTICLE_ID=A.ID WHERE A.ID=?
Jak to zapytanie przełożyć na HQL?
@Entity
@Table(name = "ACCOUNT")
public class User extends AbstractEntity {
private String firstName;
private String lastName;
private String login;
private String password;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(
name = "USER_COMMENT",
joinColumns = @JoinColumn(name = "USER_ID"),
inverseJoinColumns = @JoinColumn(name = "COMMENT_ID")
)
private Set<Comment> commentSet = new HashSet<>();
public void addComment(Comment comment) {
this.commentSet.add(comment);
}
public void removeComment(Comment comment) {
this.commentSet.remove(comment);
}
}
@Entity
public class Article extends AbstractEntity {
private String name;
@Lob
private String content;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(
name = "ARTICLE_COMMENT",
joinColumns = @JoinColumn(name = "ARTICLE_ID"),
inverseJoinColumns = @JoinColumn(name = "COMMENT_ID")
)
private Set<Comment> commentSet = new HashSet<>();
private Article() {}
public Article(User author) {
this.author = author;
}
public void addComment(Comment comment) {
this.commentSet.add(comment);
}
public void removeComment(Comment comment) {
this.commentSet.remove(comment);
}
}
@Entity
public class Comment extends AbstractEntity {
@Column(name = "CONTENT", nullable = false)
@Lob
private String content;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "AUTHOR_ID")
private User author;
private Comment() {}
public Comment(String content, User author) {
this.content = content;
this.author = author;
}
}