19
回答
Spring-Data-JPA 中的查询如何动态组装条件?

看了一下,SpringSide 中 Spring-Data-JPA 的示例都是简单的查询。

现在有个简单的场景:页面有一个“用户名”查询框和一个查询按钮。点击查询按钮,动态组装的sql无非就是下面两条:

select * from user
select * from user where username like '%term%'

用 Spring-Data-JPA 应该怎么做呢?看到的都是用 Specifications 的简单例子。http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/#specifications

 

举报
共有19个答案 最后回答: 2年前
接口:Page<T> findAll(Specification<T> spec, Pageable pageable);

Page<User> findAll(name,age,pn,ps){
  dao.findAll(Specifications.where(getWhereClause(name,age)),
  new PageRequest(pn-1,ps));
}

private Specification<User> getWhereClause(name,age) {
  return new Specification<User>() {
    @Override
    public Predicate toPredicate(Root<User> r, CriteriaQuery<?> q, CriteriaBuilder cb) {
    Predicate predicate = cb.conjunction();
       if (StringUtils.isNotBlank(name)) {
         predicate.getExpressions().add(
           cb.like(r.<String>get("name"), "%" + StringUtils.trim(name) + "%")
         );
       }
       ...
       return predicate;
    }
  };
}

 

--- 共有 2 条评论 ---
南北桥我想知道查询条件的DTO怎么组装? 2年前 回复
xianwu13这是查询一张表,如果是两张表关联,jpa会提供动态sql的功能吗?谢谢 3年前 回复
但是参数是动态的哦,就是说查询的时候很多条件,有得时候只选择一个条件,有得时候选择多个条件,怎么办呢
--- 共有 2 条评论 ---
laumtt回复 @纯天然原味酱 : 动态分组怎么实现呢,哥们 6年前 回复
纯天然原味酱简单的做法,参数都写全了,不为空的条件就组装进去。 上面举的例子,条件是name和age,name如果isnotblank才组装like条件 6年前 回复

引用来自“纯天然原味酱”的评论

接口:Page<T> findAll(Specification<T> spec, Pageable pageable);

Page<User> findAll(name,age,pn,ps){
  dao.findAll(Specifications.where(getWhereClause(name,age)),
  new PageRequest(pn-1,ps));
}

private Specification<User> getWhereClause(name,age) {
  return new Specification<User>() {
    @Override
    public Predicate toPredicate(Root<User> r, CriteriaQuery<?> q, CriteriaBuilder cb) {
    Predicate predicate = cb.conjunction();
       if (StringUtils.isNotBlank(name)) {
         predicate.getExpressions().add(
           cb.like(r.<String>get("name"), "%" + StringUtils.trim(name) + "%")
         );
       }
       ...
       return predicate;
    }
  };
}

 

感谢,解决我的大问题
顶部