我有一个名为@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?
答案 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();