Hibernate - Pobranie encji za pomocą tabeli łączącej

0

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

1

Najprościej jest wybrać klienta/artykuł po ID za pomocą FETCH JOIN, by zachłannie pobrać kolekcje. Względnie:

SELECT c FROM Comment c WHERE c.author.id=:id
0

W przypadku pobrania komentarzy wystawionych przez Autora owszem zgadzam się - autor jest tutaj tylko informacyjnie nie ma związku z pytaniem. Chodzi o przypadek pobrania komentarzy które otrzymał inny użytkownik lub inny artykuł czyli Article.commentSet lub user.commentSet za pomocą przekazanego identyfikatora userId lub articleId. Z tym, że chciałbym pobrać te komentarze bezpośrednio bez pobierania encji User lub Article.

1

Okazało się prostsze niż myślałem.. Dla zainteresowanych:

select u.commentSet from User u where u.id = ?1

lub analogiczne

select a.commentSet from Article a where a.id = ?1

Dzięki za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1