所以我真的一直在努力解决这个问题,但似乎没有关于如何做到这一点的好的文档。我有一个带有实体RepairMan列表的Skill实体。我需要一个可以返回一个List<RepairMan>包含所有技能 ID 的技能列表的查询。下面是实体的样子:
@Entity
@Table(name = "REPAIRMAN")
public class RepairMan implements Serializable
{
private static final long serialVersionUID = 8151638047721448259L;
@SequenceGenerator(name="REPAIRMAN_SEQ", sequenceName="REPAIRMAN_SEQ", allocationSize=1, initialValue=100)
@Id @GeneratedValue(generator="REPAIRMAN_SEQ")
private Long id;
@OneToMany
@JoinTable(name="REPAIRMAN_SKILLS", joinColumns=@JoinColumn(name="REPAIRMAN_ID"), inverseJoinColumns=@JoinColumn(name="SKILL_ID"))
private List<Skill> skills;
....
}
@Entity
@Table(name = "SKILL")
public abstract class Skill implements Serializable
{
private static final long serialVersionUID = -5272849377636005084L;
@SequenceGenerator(name="SKILL_SEQ_GEN", sequenceName="SKILL_SEQ", allocationSize=1, initialValue=100)
@Id
@GeneratedValue(generator="SKILL_SEQ_GEN", strategy=GenerationType.SEQUENCE)
private Long id;
@Column(name="NAME")
private String name;
@Column(name="DESCRIPTION")
private String description;
...
}
Run Code Online (Sandbox Code Playgroud)
这是我想要的签名以及我在脑海中想到的:
public class RepairManRepositoryImpl extends QueryDslRepositorySupport implements RepairManRepositoryCustom
{
public CompanyInspectorRepositoryImpl()
{
super(RepairMan.class);
}
@Override
public List<RepairMan> getRepairMenByRequiredSkills(List<Long> skillIds)
{
PathBuilder<RepairMan> repairManPath = new PathBuilder<>(RepairMan.class, "repairman");
PathBuilder repairManSkillsPath = repairManPath.get("skills"); // probably wrong
BooleanBuilder hasAllSkills = new BooleanBuilder();
for (Long skillId : skillIds)
{
hasAllSkills.and(repairManSkillsPath.getNumber("id", Long.class).eq(skillId));
}
JPAQuery query = new JPAQuery(getEntityManager())
.from(repairManPath)
//need to join the repairManSkills somehow
.where(hasAllSkills);
return query.list(repairManPath);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这并不完全有效,而且我知道使用 Qclasses 会更容易,但出于兼容性原因我不能做 Qclasses。
| 归档时间: |
|
| 查看次数: |
1666 次 |
| 最近记录: |