首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPA CriteriaQuery ManyToMany谓词

JPA CriteriaQuery ManyToMany谓词
EN

Stack Overflow用户
提问于 2021-10-20 16:43:45
回答 1查看 31关注 0票数 0

歌曲和艺术家之间存在一种多对多的关系,如下所示:

代码语言:javascript
复制
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;
    }

}

artist类是一个基本的实体

代码语言:javascript
复制
public class Artist {
}

给定Song x,显示Song x中涉及的任何艺术家的歌曲,原始SQL查询将如下所示

代码语言:javascript
复制
SELECT * FROM songs WHERE id IN((SELECT song FROM song_artists x WHERE x.artist = ?));

哪里“?”将被相关歌曲中涉及的以逗号分隔的艺术家ID字符串所取代

如何使用JPA实现相同的结果(特别是使用Hibernate )

代码语言:javascript
复制
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

我们如何过滤这里的结果(从" artists“集合中的任何一个艺术家那里获得更多的歌曲)?

我们将非常感谢您的反馈

EN

回答 1

Stack Overflow用户

发布于 2021-10-21 11:42:00

解决了!

如果你遇到类似的情况,我是这么做的:

代码语言:javascript
复制
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)
    )
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69649974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档