queryDSL 实体的列表包含所有

jen*_*gar 5 java jpa querydsl

所以我真的一直在努力解决这个问题,但似乎没有关于如何做到这一点的好的文档。我有一个带有实体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。