使用 Querydsl 获取 @ElementCollection 条目
get @ElementCollection entries with Querydsl
我有一个@Entity class,其中包含一个@ElementCollection:
@Entity
public class Skill extends JpaEntity {
@ElementCollection(targetClass = SkillName.class)
@CollectionTable(joinColumns = @JoinColumn(name = "SKILL_ID"))
private Set<SkillName> names = new HashSet<>();
...
这些元素在没有 ID 的嵌套 @Embeddable class 中定义:
@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) 一切正常,但我得到的是字符串列表而不是技能名称列表。
所以问题是:
我该怎么做才能通过 Querydsl 获取 @ElementCollection 的 @Embeddables 列表?
由于您正在寻找实体内的 Embeddable 对象,您可能会从实体导航到请求的 Embeddable(在您的情况下 "SkillName") - 因此您的查询应更改为 list(skill) - the实体:
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
您不能直接投影 Embeddable 实例,但您也可以使用
Projections.bean(SkillName.class, ...)
填充它们或
Projections.tuple(...)
将 skillName 属性作为 Tuple 实例获取
我有一个@Entity class,其中包含一个@ElementCollection:
@Entity
public class Skill extends JpaEntity {
@ElementCollection(targetClass = SkillName.class)
@CollectionTable(joinColumns = @JoinColumn(name = "SKILL_ID"))
private Set<SkillName> names = new HashSet<>();
...
这些元素在没有 ID 的嵌套 @Embeddable class 中定义:
@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) 一切正常,但我得到的是字符串列表而不是技能名称列表。
所以问题是: 我该怎么做才能通过 Querydsl 获取 @ElementCollection 的 @Embeddables 列表?
由于您正在寻找实体内的 Embeddable 对象,您可能会从实体导航到请求的 Embeddable(在您的情况下 "SkillName") - 因此您的查询应更改为 list(skill) - the实体:
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
您不能直接投影 Embeddable 实例,但您也可以使用
Projections.bean(SkillName.class, ...)
填充它们或Projections.tuple(...)
将 skillName 属性作为 Tuple 实例获取