2017-04-14 66 views
4

我有幾個存儲庫可以擴展org.springframework.data.mongodb.repository.MongoRepository。我添加了一些用不同參數搜索實體的方法,但是,在任何搜索中,我只想搜索active字段設置爲true(選擇標記爲active=false代替刪除)的實體。例如,兩個樣本庫應該是這樣的:春季數據存儲 - 爲每個查詢添加特定參數

interface XxRepository extends MongoRepository<Xx, String> { 

    Optional<Xx> findOneByNameIgnoreCaseAndActiveTrue(String name) 

    Page<Xx> findByActiveTrue(Pageable pageable) 

    Xx findOneByIdAndActiveTrue(String id) 

} 

interface YyRepository extends MongoRepository<Yy, String> { 

    Optional<Yy> findOneByEmailAndActiveTrue(String email) 
} 

有沒有辦法,讓我不要\ andActiveTrue添加byActiveTrue到每一個方法,並在一處地方設置它爲所有的疑問?

回答

0

您可以使用Criteria將模板查詢寫入MongoRepository。 例

class abstract MongoRepository<W, X> { 

    protected Class<W> typeOfEntity; 
    private Class<X> typeOfId; 

    public MongoRepository() { 
     typeOfEntity = (Class<W>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
     typeOfId = (Class<X>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
    } 

    public W get(X id) throws Exception { 
     CriteriaBuilder cb = em.getCriteriaBuilder(); 
     CriteriaQuery<W> q = cb.createQuery(typeOfEntity); 
     Root<W> r = q.from(typeOfEntity); 

     String idName = CommonEntity.findIdFieldName(typeOfEntity); 
     Predicate andClose = cb.and(cb.equal(r.get("active"), true)); 

     q.where(cb.equal(r.get(idName), id), andClose); 

     return em.createQuery(q).getSingleResult(); 
    } 
} 

之後,你留自信到對象中運行方式ANS成見運行良好類型的請求。

findIdFieldName是一種使用@Id獲取id字段名稱的方法。

public abstract class CommonEntity implements Serializable { 

    public static String findIdFieldName(Class cls) { 
     for (Field field : cls.getDeclaredFields()) { 
      String name = field.getName(); 
      Annotation[] annotations = field.getDeclaredAnnotations(); 
      for (int i = 0; i < annotations.length; i++) { 
       if (annotations[i].annotationType().equals(Id.class)) { 
        return name; 
       } 
      } 
     } 
     return null; 
    } 
} 
+0

是的,但我喜歡在春天的數據儲存庫中的自定義查詢的簡潔性和可讀性的風格,所以我想知道如果有一種方法可以繼續使用查詢生成的聲明的方式,但不重複該但是,不確定是否有任何實現它的方式。 – OlgaMaciaszek

+0

你可以使用繼承的方式來編碼我爲你提供的,只需通過'Query q = em.createQuery(「Select * From table Where id =:idValue and active = true」)來獲得'W get(X id)'字段。 ; q.setParameters(「idValue」,id); return'em_getSingleResult();' – Zorglube

+0

然後,在每個存儲庫對象繼承'MongoRepository '你'Override'通過'@Override獲取方法get(X id){super.get(id); }' – Zorglube

3

請試試這個。無需提供實施。將「活動」和「電子郵件」更改爲您的數據庫列名稱。

interface YyRepository extends MongoRepository<Yy, String> { 
    @Query(value = "{ 'active' : { '$eq': true }, 'email' : ?0 }") 
    Optional<Yy> findOneByEmailAndActiveTrue(@Param("email") String email) 
} 
+0

我的回購工作中已經有了這樣的命名和方法。我只是在尋找一種避免方法名稱重複的方法。 – OlgaMaciaszek

+0

你可以有任何你想要的方法。通過這種方式,活動的真從查詢參數傳遞而不是方法名稱。 – ddarellis