簡體   English   中英

JPA CriteriaQuery ManyToMany 謂詞

[英]JPA CriteriaQuery ManyToMany Predicate

歌曲和藝術家之間存在多對多關系,如下所示:

public class Song {
    // ... other fields here
    protected Collection<Artist> artists;
    
    @JoinTable(
        name = "song_artists",
        schema = "playout",
        joinColumns = @JoinColumn(name = "song"),
        inverseJoinColumns = @JoinColumn(name = "artist"),
        foreignKey = @ForeignKey(name = "fk_song_artists_song"),
        inverseForeignKey = @ForeignKey(name = "fk_audio_artists_artist")
    )
    @ManyToMany
    public Collection<Artist> getArtists(){
        return artists;
    }

}

藝術家類是一個基本的實體

public class Artist {
}

給定一個 Song x,顯示 Song x 中涉及的任何藝術家的歌曲,原始 SQL 查詢將是這樣的

SELECT * FROM songs WHERE id IN((SELECT song FROM song_artists x WHERE x.artist = ?));

在哪里 '?' 將替換為相關歌曲中涉及的以逗號分隔的藝術家 ID 字符串

如何使用 JPA 實現相同的結果(專門使用 Hibernate)

Song song = null; // get desired song
Collection<Artist> artists = song.getArtists();

CriteriaBuilder builder = entityManager.getCriteriaBuilder()
CriteriaQuery criteria = builder.createQuery(Song.class);
Root<Song> root = criteria.from(Song.class);

Subquery<Artist> subquery = null; // how to create an appropriate subquery from the join

我們如何在這里過濾結果(獲得“藝術家”集合中任何藝術家的更多歌曲)?

非常感謝您的反饋

解決了!

如果你遇到類似的事情,這就是我所做的:

Subquery<Artist> subquery = criteria.subquery(Artist.class);
subquery.from(Artist.class);
Join<Audio, Artist> join = subquery.correlate(root.join("artists", JoinType.LEFT));

subquery.select(builder.nullLiteral(Artist.class));
subquery.where(join.in(value.getArtists()));

criteria.select(root).where(
    builder.and(
        builder.notEqual(root, value), builder.exists(subquery)
    )
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM