2015-06-01 71 views
3

我正在使用角度js,spring mvc和spring jpa數據處理web應用程序。 我想知道是否有類似的標準和detachedcriteria(休眠)來構建與春季jpa數據的高級查詢。春季數據標準

+0

[Dynamic spring data jpa repository query with any AND clauses]的可能重複(http://stackoverflow.com/questions/28874135/dynamic-spring-data-jpa-repository-query-with-arbitrary-andclauses ) – iamiddy

回答

3

是的,你可以使用Specifications,它基本上使用Criteria API(顯然,因爲Spring Data JPA只是JPA的一個包裝)。

+0

保存引用2個其他對象的對象的最佳方式是什麼?如何只用一個查詢來做到這一點。 (不需要從數據庫中獲取它們)。 – housseminfo

+0

你應該問這是一個新問題(並接受我的答案,如果它可以幫助你解決第一個問題)。 – dunni

+0

你也應該閱讀http://stackoverflow.com/help,尤其是「詢問」部分。 – dunni

4

沒有什麼阻止你還在使用標準

@Repository 
public interface FooRepository extends JpaRepository<Foo, Long>, FooRepositoryCustom { 

} 

interface FooRepositoryCustom { 

    public List<Foo> findByBar(Bar bar); 
} 

class FooRepositoryImpl implements FooRepositoryCustom { 

    @PersistenceContext 
    protected EntityManager em; 

    @Transactional(readOnly = true) 
    public List<Foo> findByBar(Bar bar) { 

     Criteria crit = em.unwrap(Session.class).createCriteria(Foo.class); 

     crit.add(Restrictions.eq("name", bar.getName())); 

     ... 

     crit.setResultTransformer(DetachedCriteria.DISTINCT_ROOT_ENTITY); 

     List<Foo> foos = crit.list(); 

     return foos; 

    } 
} 
1

可以使用Query Dsl ,它比Specification更簡潔,這裏是含有SpecificationQueryDsl一個blog

0

您可以使用標準使用Spring的數據,你不需要自定義庫,你可以使用JpaSpecificationExecutor,這裏一個例子:

你的資料庫:

@Repository("yourRepository") 
public interface YourRepository extends JpaRepository, JpaSpecificationExecutor 
{ 
} 

您服務

@Override 
public List<YourModel> yourDataModel getAllEntitiesByAttr(String attrValue){ 
    List<YourModel> yourDataModel = null; 
    try { 
    Specification specification=getAndSpecByAttribute("attribute",attrValue); 
    List list = userRepository.findAll(specification); 
    yourDataModel =orikaMapper.mapAsList(list, YourModel.class); 
    } catch (Exception e) { 
    throw e; 
    } 
    return yourDataModel; 
} 
private Specification getAndSpecByAttribute(String attribute, String valueAttribute){ 
return new Specification() { 
     @Override public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) { 
     Path path = root.get(attribute); 
     return cb.equal(path, valueAttribute); 
     }; 
    }; 
} 

這就夠了。