【问题标题】:JPA CriteriaQuery ManyToMany PredicateJPA CriteriaQuery 多对多谓词
【发布时间】:2021-12-07 12:14:35
【问题描述】:

歌曲和艺术家之间存在这样的多对多关系:

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

给定一首歌曲 x,显示参与歌曲 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

我们如何在这里过滤结果(获取“艺术家”收藏中任何艺术家的更多歌曲)?

非常感谢您的反馈

【问题讨论】:

    标签: spring-boot hibernate jpa criteria hibernate-criteria


    【解决方案1】:

    解决了!

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

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

    【讨论】:

      猜你喜欢
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 2017-03-21
      • 2015-12-16
      • 1970-01-01
      • 2012-08-28
      相关资源
      最近更新 更多