Мне нужна одна строка на skill
независимо от того, связан ли skill
с user
. В skill
есть <1000 строк. Однако SQL, сгенерированный JPA / Hibernate, возвращает <code>skill строк для всех пользователей.
JPA
select case when su = :user then 1 else 0 end from Skill s left join s.skillUsers su on su = :user order by s.id
SQL я написал, что работает
select case when us.user_id = 1 then 1 else 0 end from skill as s left join user_skills as us on us.skill_id = s.id and us.user_id = 1
SQL, созданный Hibernate / JPA, который не работает
select case when user2_.id=? then 1 else 0 end as col_0_0_ from skill skill0_ left outer join user_skills skillusers1_ on skill0_.id=skillusers1_.skill_id left outer join user user2_ on skillusers1_.user_id=user2_.id and (user2_.id=?) order by skill0_.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;
}