【问题标题】:get @ElementCollection entries with Querydsl使用 Querydsl 获取 @ElementCollection 条目
【发布时间】:2015-04-23 19:43:58
【问题描述】:

我有一个拥有@ElementCollection 的@Entity 类:

@Entity
public class Skill extends JpaEntity {
  @ElementCollection(targetClass = SkillName.class)
  @CollectionTable(joinColumns = @JoinColumn(name = "SKILL_ID"))
  private Set<SkillName> names = new HashSet<>();
...

这些元素在没有 ID 的嵌套 @Embeddable 类中定义:

  @Embeddable
  @Immutable
  @Table(uniqueConstraints = @UniqueConstraint(columnNames = "NAME"))
  public static class SkillName extends ValueObject {
    private boolean selectable;
    @Column(unique = true, nullable = false)
    @Size(max = 64)
    @NotEmpty
    private String name;
...

我尝试通过 Querydsl 获取该元素集合的一些特定元素:

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

    List<SkillName> foundSkillNames = from(skill)
    .innerJoin(skill.names, skillName).where(...)
    .list(skillName);

这给了我一个 MySQLSyntaxErrorException: Unknown column 'names1_.id' in 'field list' 因为结果查询看起来像:

select names1_.id as col_0_0_ from Skill skill0_ inner join Skill_names names1_ on ...

这显然是错误的,因为 SkillName 没有 id

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

所以问题是: 我该怎么做才能通过 Querydsl 获取 @ElementCollection 的 @Embeddables 列表?

【问题讨论】:

    标签: jpa querydsl


    【解决方案1】:

    由于您正在实体内寻找可嵌入对象,您可以从实体导航到请求的可嵌入对象(在您的情况下为“SkillName”) - 因此您的查询应更改为列表(技能) - 实体:

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

    HTH

    【讨论】:

      【解决方案2】:

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

      • Projections.bean(SkillName.class, ...) 填充它们或
      • Projections.tuple(...) 获取作为 Tuple 实例的 SkillName 属性

      【讨论】:

        猜你喜欢
        • 2020-07-05
        • 2018-08-21
        • 1970-01-01
        • 2020-07-04
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 2022-01-07
        • 2015-01-01
        相关资源
        最近更新 更多