2015-06-01 72 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); 
     }; 
    }; 
} 

这就够了。