簡體   English   中英

如何執行以使用查詢條件過濾持久集

[英]What should be done to get the Persistent Set filtered using a query condition

我有兩個這樣的DAO類FeeGroupFeeHeading

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查詢,用於基於FeeHeadingFeeGroup 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM