【问题标题】:QueryDSL4 JPA SubQuery with @ElementCollection使用@ElementCollection 查询DSL4 JPA 子查询
【发布时间】:2018-01-13 04:53:02
【问题描述】:

我有一个名为Video@Entity,它包含@ElementCollection 标签:

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

我想过滤带有标签的视频,SQL 是这样的

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

但我不知道如何使用 JPAQuery 来实现:

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

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

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

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

【问题讨论】:

    标签: querydsl


    【解决方案1】:

    对于来这里了解如何普遍加入@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();
    

    【讨论】:

      猜你喜欢
      • 2013-01-21
      • 1970-01-01
      • 2021-02-17
      • 2012-08-19
      • 2017-05-22
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多