有沒有一種方法可以定義一個Spring Data Specification(返回一個JPA謂詞),其唯一目的是執行預先抓取?我有一個使用延遲加載定義各種關係的實體,但有幾個查詢要返回包括所有相關集合在內的整個實體表示,但這些查詢的標準可能會有所不同。我見過幾篇文章(例如spring forum),討論了可能引入獲取組的可能是理想解決方案;然而,由於這還不是JPA規範的一部分,Spring Data不提供對它的支持。彈簧數據JPA獲取
我正在尋找一種可重複使用的方式來執行各種動態查詢的預先獲取。
例如,我已經考慮開發可重用的規範,其唯一目的是執行預先加載,並且可以與其他規格組合在一起,例如:
private static Specification<MyEntity> eager() {
return new Specification<MyEntity>() {
@Override
public Predicate toPredicate(Root<MyEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
for (PluralAttribute<? super MyEntity, ?, ?> fetch : root.getModel().getPluralAttributes()) {
root.fetch(fetch, JoinType.LEFT);
}
query.distinct(true);
return null;
}
};
}
該規範的目標是重複使用在不同的查詢,如:
repository.findAll(where(eager()).and(otherCriteria).or(otherCriteria));
然而,渴望獲取規範是不是真正的謂語,所以它返回null
,並會造成明顯的問題(即NullPointerExceptions
)時CHAINE d與其他謂詞。 (請注意,此謂詞單獨確實按預期工作;即以下查詢將正確取出:repository.findAll(eager());
)。
是否存在可以從「渴望」規範返回的適當的非空謂詞,或者是否存在其他可重用的方法來使用Spring Data JPA規範觸發提前提取(而不必將負載加載到另一個規範)?
我在使用您的方法時出現以下異常:「查詢指定的聯接抓取,但抓取的關聯的所有者未出現在選擇列表中」。 – svlada 2015-04-21 19:00:05
或者,是否有這樣的方法可以使所有關係都變得懶惰? – chrismarx 2015-11-05 19:20:40