Jpa 使用Querydsl获取@ElementCollection条目

Jpa 使用Querydsl获取@ElementCollection条目,jpa,querydsl,Jpa,Querydsl,我有一个@Entity类,它包含一个@ElementCollection: @Entity public class Skill extends JpaEntity { @ElementCollection(targetClass = SkillName.class) @CollectionTable(joinColumns = @JoinColumn(name = "SKILL_ID")) private Set<SkillName> names = new HashS

我有一个@Entity类,它包含一个@ElementCollection:

@Entity
public class Skill extends JpaEntity {
  @ElementCollection(targetClass = SkillName.class)
  @CollectionTable(joinColumns = @JoinColumn(name = "SKILL_ID"))
  private Set<SkillName> names = new HashSet<>();
...
我尝试通过Querydsl获取该元素集合的一些特定元素:

    QSkill skill = QSkill.skill;
    QSkill_SkillName skillName = QSkill_SkillName.skillName;

    List<SkillName> foundSkillNames = from(skill)
    .innerJoin(skill.names, skillName).where(...)
    .list(skillName);
这显然是错误的,因为SkillName没有id

如果我将.list(skillName)替换为.list(skillName.name),一切正常,但我得到的是字符串列表,而不是skillName列表

所以问题是:
如何通过Querydsl获取@ElementCollection的@Embeddedables列表?

由于您正在实体内寻找可嵌入对象,您可以从实体导航到请求的可嵌入对象(在您的示例中为“SkillName”)-因此,您的查询应改为list(skill)-实体:

List<Skill> list = 
    from(skill).innerJoin(skill.names, skillName).
    where(skillName.name.like(str)).
    list(skill);

for (Skill skill : list) {
  // do something with 
  Set<SkillNames> skillNames = skill.getNames();
}
列表=
from(skill).innerJoin(skill.names,skillName)。
其中(skillName.name.like(str))。
清单(技能);
用于(技能:列表){
//处理
Set skillNames=skill.getNames();
}

HTH

您不能直接投影可嵌入实例,但也可以使用

  • Projections.bean(SkillName.class,…)
    来填充它们或
  • Projections.tuple(…)
    以获取作为tuple实例的skillName属性
select names1_.id as col_0_0_ from Skill skill0_ inner join Skill_names names1_ on ...
List<Skill> list = 
    from(skill).innerJoin(skill.names, skillName).
    where(skillName.name.like(str)).
    list(skill);

for (Skill skill : list) {
  // do something with 
  Set<SkillNames> skillNames = skill.getNames();
}