[英]What should be done to get the Persistent Set filtered using a query condition
我有兩個這樣的DAO類FeeGroup
和FeeHeading
class FeeGroup {
private int id;
private String name;
private Set<FeeHeading> feeHeadings;
private booelan isActive;
//getters & setters
}
class FeeHeading {
private int id;
private String name;
private FeeGroup feeGroup;
private booelan isActive;
//getters & setters
}
這是HQL
查詢,用於基於FeeHeading
和FeeGroup
isActive
值獲取結果。
select fg.feeHeadings
from FeeHeading fh
join fh.feeGroup fg
where fg.isActive = 1
and fg.isOptional = 0
and fh.isActive = 1
and fg.id = 78
該FeeGroup
ID為78由具有10 FeeHeading
下它S和只有一個標題由具有isActive為1.當前查詢返回的10條記錄,即使我給濾波條件作為fh.isActive = 1
。 但是當我將查詢更改為
select fh.name
from FeeHeading fh
join fh.feeGroup fg
where fg.isActive = 1
and fg.isOptional = 0
and fh.isActive = 1
and fg.id = 78
只有一個記錄即將到來,這是唯一的活動記錄。 那么,為什么即使給出條件,也沒有首先獲得過濾的Set
,還是應該在查詢中進行過濾以獲取過濾的結果呢?
在第一個查詢中,從(組)中至少有一個滿足條件的標題中選擇所有標題。 即您小組中的所有10個標題。
在第二個查詢中,僅選擇滿足條件的標題。 即只有一個標題。
在第一個語句中,選擇所有FeeGroups
並返回其關聯的FeeHeadings
。 您無法創建查詢父對象的列表的子列表。 JPA正在過濾查詢,然后必須使用完整的元素加載所有請求的對象。 如果FeeGroup
滿足您的要求( id
= 78並且isOptional
= 0且至少一個具有isActive
= 1的FeeHeading
= 1),則它必須加載整個組。
在第二個查詢中,您直接選擇FeeHeadings
,因此可以創建它們的子列表,因為JPA必須僅創建該對象。
UPDATE
到目前為止,尚未進行測試,但是您可以測試以下JPQL是否會為您提供所需的結果:
select fh
from FeeHeading fh
where fh.feeGroup.isActive = 1
and fh.feeGroup.isOptional = 0
and fh.isActive = 1
and fh.feeGroup.id = 78
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.