Java JPA Left Join正在生成返回太多行的SQL

Java JPA Left Join正在生成返回太多行的SQL,java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,无论技能是否与用户关联,我都需要为每个技能设置一行。skill中有

无论
技能
是否与
用户关联,我都需要为每个
技能
设置一行。
skill
中有<1000行。但是,JPA/Hibernate生成的SQL为所有用户返回
skill

JPA

选择su=:user时的case,然后选择1 else 0从技能s左结束加入s.skillUsers su on su=:用户按s.id订购

我编写的行之有效的SQL

当us.user\u id=1时选择case,然后选择1,否则0结束于skill as s left加入user\u skills as us.skill\u id=s.id和us.user\u id=1

由Hibernate/JPA生成的SQL不起作用

当user2.id=?然后1个其他0结束为col_0_0_0_,来自skill0上的skill0左外部联接用户_skillusers1_.id=skillusers1 u.skill_id左外部联接用户u2 2 1 2.id=user2 2.id=?)按skill0 0.id排序

技能实体

@BatchSize(size = 100)
@ManyToMany(mappedBy = "userSkills")
@LazyCollection(LazyCollectionOption.EXTRA)
public Set<User> getSkillUsers() {
    return skillUsers;
}
@JoinTable(name = "user_skills", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), uniqueConstraints = @UniqueConstraint(name = "UK_user_skill", columnNames = {"user_id", "skill_id"}), inverseJoinColumns = @JoinColumn(name = "skill_id", referencedColumnName = "id"))
@ManyToMany
@LazyCollection(LazyCollectionOption.EXTRA)
public Set<Skill> getUserSkills() {
    return userSkills;
}
@BatchSize(大小=100)
@ManyToMany(mappedBy=“userSkills”)
@LazyCollection(LazyCollectionOption.EXTRA)
公共集getSkillUsers(){
返回技能用户;
}
用户实体

@BatchSize(size = 100)
@ManyToMany(mappedBy = "userSkills")
@LazyCollection(LazyCollectionOption.EXTRA)
public Set<User> getSkillUsers() {
    return skillUsers;
}
@JoinTable(name = "user_skills", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), uniqueConstraints = @UniqueConstraint(name = "UK_user_skill", columnNames = {"user_id", "skill_id"}), inverseJoinColumns = @JoinColumn(name = "skill_id", referencedColumnName = "id"))
@ManyToMany
@LazyCollection(LazyCollectionOption.EXTRA)
public Set<Skill> getUserSkills() {
    return userSkills;
}
@JoinTable(name=“user\u skills”,joinColumns=@JoinColumn(name=“user\u id”,referencedColumnName=“id”),uniqueConstraints=@UniqueConstraint(name=“UK\u user\u skill”,columnnams={“user\u id”,“skill\u id”}),inverseJoinColumns=@JoinColumn(name=“skill\u id”,referencedColumnName=“id”))
@许多
@LazyCollection(LazyCollectionOption.EXTRA)
公共集getUserSkills(){
返回用户技能;
}

SQL的问题是您需要user2\ux.id=?在涉及用户技能的第1个左侧加入。之所以会有这么多记录,是因为它会显示所有技能、所有用户技能,然后只显示ID与输入参数匹配的用户。我对JPA了解不够,无法说出如何做到这一点;这是一个评论。但问题就在这里。也许你需要搜索关联而不是实体:或者?