春季数据的标准

时间:2015-06-01 13:30:29

标签: spring hibernate spring-data

我正在使用角度js,spring mvc和spring jpa数据处理Web应用程序。 我想知道是否有类似于条件和detachedcriteria(hibernate)的东西来构建带有spring jpa数据的高级查询。

4 个答案:

答案 0 :(得分:4)

没有什么能阻止你继续使用Criteria

@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 :(得分:3)

是的,您可以使用Specifications,它基本上使用Criteria API(显然,因为Spring Data JPA只是JPA的一个包装)。

答案 2 :(得分:1)

你可以使用Query Dsl ,它比Specification更简洁,这里有一个包含SpecificationQueryDsl的{​​{3}}。

答案 3 :(得分:0)

您可以将标准与​​Spring Data一起使用,您不需要自定义存储库,您可以使用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);
      };
    };
}

这就够了。