[英]JPQL does not work properly
家長班:
@Table(name = "users")
class User {
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
List<Gender> genders = new ArrayList<>();
子班:
@Table(name = "gender")
class Gender {
@ManyToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "userId", nullable = false)
User user;
String sex;
我在MySQL中的目標:
從用戶中選擇*從左加入性別b在a.id = b.id上b.sex ='dasd'
返回1 ROW,效果很好。 我只有一條符合這一條件的記錄。
但是JPQL中的相同代碼:
從用戶中選擇一個左聯接a。性別b在哪里b.sex ='dasd'
返回值:一個用戶–正確,並且表Gender中的所有性別均正確,但是我只希望當sex ='dasd'並且只有一個滿足此條件的記錄時才想要。btw JPQL生成N + 1問題,並且每個子查詢都忽略條件性別='dasd'
如何編寫滿足條件的子查詢? 我可以強制子查詢僅返回與JPQL查詢匹配的性別嗎?
在JPQL中,您從實體而非表格中選擇,
SELECT a FROM User a LEFT JOIN a.genders b WHERE b.sex ='dasd'
由於將a.genders列表配置為EAGER,因此每次選擇用戶時,它將獲取與該用戶關聯的所有性別。 即使它們與JPQL查詢不匹配。
如果您將a.genders列表設置為LAZY,則它將不會獲取任何性別,因為您僅從用戶中選擇了
該查詢相當於SQL
SELECT a.* FROM users a LEFT JOIN genders b ON a.id=b.id WHERE b.sex='dasd'
如果您只選擇一種性別
SELECT b FROM Gender b WHERE b.user = :user AND b.sex = 'dasd'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.