SpringDateJpa实现多条件分页动态sql语句

1创建SpringBoot项目

2导入依赖

在pom.xml复制如下代码

<!-- Spring Boot JPA 依赖 --> 
  <dependency> 
   <groupId>org.springframework.boot</groupId> 
   <artifactId>spring-boot-starter-data-jpa</artifactId> 
  </dependency>

3创建各包

controller 转发请求与响应

dao 接口方法存放

entity 实体类存放

service 业务方法

service.Imp方法实现

spring jpa 动态查询 spring jpa 动态sql_java

4.创建实体类

我这里创建的是Student(学生实体类)

//小辣椒创建get/set,toString()方法,没有的请加上get/set,toString()方法
@Data
//jpa自动创建数据库
@Entity
public class Student {
 //主键标识
 @Id
 //自动递增
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private Integer sId;//学生id
 private String sName;//学生Name
 private Integer sAge;//学生年龄
 private Date sSex;//学生性别
}

5.在dao包创建接口

接口名StudentDao

/**
 * 里面内置了许多实用的方法
 * JpaRepository<Student, Integer>
 * Student是实体类,Integer是实体类中主键的数据类型
 * 
 * 生成动态sql的接口
 * JpaSpecificationExecutor<Student>
 *
 */
public interface StudentDao extends JpaRepository<Student, Integer>,JpaSpecificationExecutor<Student>{

6.创建业务接口

接口名StudentService
我们要完成的业务是多条件分页查询所以要创建一个自定义方法

public interface StudentService {
 /**
  * 分页多条件查询
  */
 Map<String, Object> findAll(PageRequest pageable,Student student);
}

7.实现业务接口

我们创建一个业务接口实现类
类名StudentServiceImp

@Service
public class StudentServiceImp implements StudentService{
@Autowired
private StudentDao studentdao;
@Override
public Map<String, Object> findAll(PageRequest pageable, Student student) {
 Page<Student> findAll = studentdao.findAll(selectquanpage(student),pageable);
 Map<String, Object> map = new HashMap<String, Object>();
 map.put("rows", findAll.getContent());
 map.put("total", findAll.getTotalElements());
 return map;
}
private Specification<Student> selectquanpage(Student student){
  return new Specification<Student>() {
   private static final long serialVersionUID = 1L;
   @Override
   public Predicate toPredicate(Root<Student> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
    // TODO Auto-generated method stub
    Predicate conjunction = cb.conjunction();
    List<Expression<Boolean>> expressions = conjunction.getExpressions();
    //模糊查询学生姓名
    /**
     * 首先if判断传进的学生姓名不能为空
     * <String>表示查询的字段的数据类型
     * get("sName")需要查询的字段,引号里需要与实体类中的一模一样区分大小写
     */
    if (student.getsName()!=null&&student.getsName()!="") {
     expressions.add(cb.like(root.<String>get("sName"), "%"+student.getsName()+"%"));
    }
    //查询学生性别
    /**
     * 首先if判断传进的学生姓名不能为空可以为0
     * 0为女,1为男
     * 
     */
    if (student.getsSex()!=null) {
     expressions.add(cb.equal(root.<Integer>get("sSex"), student.getsSex()));
    }
    
    return conjunction;
   }
  };
 }
}

8.配置配置文件

配置src/main/resources下的application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8
spring.datasource.username=数据库用户名
spring.datasource.password=密码
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
##显示sql语句
spring.jpa.show-sql=true
##修改
spring.jpa.hibernate.ddl-auto=update

9.编辑前台页面

我这里用的是Html前后台分离
框架用的EasyUi
注意!每个框架不同分页参数也可能不同
js部分

<script type="text/javascript">
   $(function(){
    init();
   } )
   //初始化
   function init() {
    var nameset=$('#nameset').val();
    var sexset=$('#sexset').combobox('getValue');
    if(sexset=="--请选择--"){
     sexset=null;
    }
    //加载表格
    $("#dg").datagrid({
     url: 'http://127.0.0.1:8080/select', 
     method:"post",
     pagination:true,
     toolbar:"#ss",
     queryParams:{
      sName:nameset,
      sSex:sexset
     }
    });
    $("#ss").form("reset");
   }
   //显示类型
   function xingbie(value, row, index) {
    return  value==1?"男":"女";
   }
   </script>

html部分代码,如果用Easyui别忘了导入

<!--查找条件栏 -->
   <form id="ss">
    <label>学生姓名:</label> 
    <input class="easyui-textbox" type="text"  id="nameset" ></input>
    <label>学生性别:</label> 
    <select id="sexset" class="easyui-combobox"  style="width: 200px;">
     <option value="--请选择--">--请选择--</option>
     <option value="1">男</option>
     <option value="0">女</option>
    </select> 
    <a href="javascript:void(0)" class="easyui-linkbutton" onclick="init()">查找</a>
   </form>
  <!--显示数据表格 -->
  <table id="dg"   class="easyui-datagrid" title="商品信息" data-options="singleSelect:true,collapsible:true,pagination:true">
   <thead>
    <tr>
     <th data-options="field:'sId'">编号</th>
     <th data-options="field:'sName'">商品名称</th>
     <th data-options="field:'sAge'">上次价格</th>
     <th data-options="field:'sSex',formatter:xingbie">类别</th>
    </tr>
   </thead>
  </table>

10运行访问

spring jpa 动态查询 spring jpa 动态sql_spring_02


前台这里我用的是HB,国产软件挺好用的

运行

spring jpa 动态查询 spring jpa 动态sql_jpa_03


成功页面

spring jpa 动态查询 spring jpa 动态sql_spring_04


以上功能就全部能用啦

最后附带数据库

-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `s_id` int(11) NOT NULL AUTO_INCREMENT,
  `s_age` int(11) DEFAULT NULL,
  `s_name` varchar(255) DEFAULT NULL,
  `s_sex` int(11) DEFAULT NULL,
  PRIMARY KEY (`s_id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '16', '赵一', '1');
INSERT INTO `student` VALUES ('2', '16', '钱二', '1');
INSERT INTO `student` VALUES ('3', '16', '孙一', '1');
INSERT INTO `student` VALUES ('4', '16', '李吴', '1');
INSERT INTO `student` VALUES ('5', '16', '周三', '0');
INSERT INTO `student` VALUES ('6', '16', '吴五', '0');
INSERT INTO `student` VALUES ('7', '15', '郑二', '0');
INSERT INTO `student` VALUES ('8', '15', '王五', '0');
INSERT INTO `student` VALUES ('9', '15', '马三', '0');
INSERT INTO `student` VALUES ('10', '15', '刘四', '0');
INSERT INTO `student` VALUES ('11', '16', '关赵', '0');
INSERT INTO `student` VALUES ('12', '16', '张三', '0');
INSERT INTO `student` VALUES ('13', '16', '曹二', '0');
INSERT INTO `student` VALUES ('14', '14', '尼八', '1');
INSERT INTO `student` VALUES ('15', '14', '徐李', '1');
INSERT INTO `student` VALUES ('16', '14', '郭一', '1');