带有@ElementCollection的QueryDSL4 JPA SubQuery

时间:2017-08-05 09:53:13

标签: querydsl

我有一个名为@Entity的{​​{1}},其中包含Video个标签:

@ElementCollection

我想用标签过滤视频,SQL看起来像这样

@Entity
@Table(name = "videos")
public class Video {
    @Id private String id;

    @ElementCollection
    @CollectionTable(name = "video_tags",
        joinColumns = {@JoinColumn(name = "video_id")})
    private List<LineTag> tags = new ArrayList<>();

    @Embeddable
    public static class LineTag {
        @Column
        private String tag;
    }
}

但我不知道如何使用JPAQuery:

select 
    v.* 
from 
    videos v
where exists (
    select 
        1 
    from 
        video_tags vt
    where 
        vt.video_id= v.id 
    and 
        tags2_.tag in ('a', 'b')
)

结果是正确的,但SQL更复杂:

JPAQuery<Video> baseQuery = new JPAQuery<Video>(entityManager)
            .from(video)
            .where(video.tags.any().tag.in("a", "b"))
            .fetch();

是否可以使用QueryDSL 4简化SQL?

1 个答案:

答案 0 :(得分:0)

对于来这里了解如何加入 @ElementCollection 中不属于实体的 @Embeddable/JPAQuery 类的任何人,这里是:

QVideo_LineTag lineTag = QVideo_LineTag.lineTag; // defined by mvn compile
List<Video> baseQuery = new JPAQuery<Video>(entityManager)
    .from(video)
    .join(video.tags, lineTag)
    .where(lineTag.tag.in("a", "b"))
    .groupBy(video.id) // exclude repetitions when multiple tags of same video match
    .fetch();