2013-03-18 179 views
8

有沒有一種方法可以定義一個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規範觸發提前提取(而不必將負載加載到另一個規範)?

+0

我在使用您的方法時出現以下異常:「查詢指定的聯接抓取,但抓取的關聯的所有者未出現在選擇列表中」。 – svlada 2015-04-21 19:00:05

+0

或者,是否有這樣的方法可以使所有關係都變得懶惰? – chrismarx 2015-11-05 19:20:40

回答

6

我們改進了nullSpecification s和Predicate s在處理DATAJPA-300時的處理。您可能想試試1.4快照,看看這會如何影響您的場景。

+0

快照對我的用例非常合適。謝謝! – shelley 2013-03-19 18:50:49

+0

@Oliver Gierke你真棒兄弟 – 2015-04-03 12:24:02