spring 数据中的标准
Criteria in spring data
我正在使用 angular js、spring mvc 和 spring jpa 数据开发 Web 应用程序。
我想知道是否有类似于 criteria 和 detachedcriteria(hibernate) 的东西来使用 spring jpa 数据构建高级查询。
是的,您可以使用 Specifications,它基本上使用条件 API(显然,因为 Spring Data JPA 只是 JPA 的包装器)。
没有什么能阻止您继续使用 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;
}
}
你可以使用 Query Dsl
, 它比 Specification
更简洁,这里是一个包含 Specification
和 QueryDsl
.
的 blog
您可以将 Criteria 与 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);
};
};
}
够了
我正在使用 angular js、spring mvc 和 spring jpa 数据开发 Web 应用程序。 我想知道是否有类似于 criteria 和 detachedcriteria(hibernate) 的东西来使用 spring jpa 数据构建高级查询。
是的,您可以使用 Specifications,它基本上使用条件 API(显然,因为 Spring Data JPA 只是 JPA 的包装器)。
没有什么能阻止您继续使用 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;
}
}
你可以使用 Query Dsl
, 它比 Specification
更简洁,这里是一个包含 Specification
和 QueryDsl
.
您可以将 Criteria 与 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);
};
};
}
够了