前几天写的,贴上来。

实体类。

  1. package com.syl.demo.daomain;
  2.  
  3. import lombok.Data;
  4.  
  5. import javax.persistence.*;
  6.  
  7. /**
  8. * Created by 孙义朗 on 2017/10/31.
  9. */
  10. @Entity
  11. @Data
  12. public class User {
  13. @Id
  14. private String userId;
  15. private String userName;
  16. private String password;
  17. private String gender;//性别
  18. private String age;
  19. @ManyToOne
  20. private School school;
  21. @ManyToOne
  22. private Grade grade;
  23. }

User

  1. package com.syl.demo.daomain;
  2.  
  3. import lombok.Data;
  4.  
  5. import javax.jws.soap.SOAPBinding;
  6. import javax.persistence.Entity;
  7. import javax.persistence.Id;
  8. import javax.persistence.ManyToOne;
  9. import javax.persistence.OneToMany;
  10.  
  11. /**
  12. * Created by 孙义朗 on 2017/10/31.
  13. */
  14. @Data
  15. @Entity
  16. public class School {
  17. @Id
  18. private String schoolId;
  19. private String schoolName;
  20.  
  21. }

School

  1. package com.syl.demo.daomain;
  2.  
  3. import lombok.Data;
  4.  
  5. import javax.persistence.*;
  6.  
  7. /**
  8. * Created by 孙义朗 on 2017/11/16.
  9. */
  10. @Entity
  11. @Data
  12. public class Grade {
  13. @Id
  14. private String gradeId;
  15. private String gradeName;
  16. @ManyToOne
  17. private School school;
  18.  
  19. }

Grade

还有一个封装查询条件的类

  1. package com.syl.demo.daomain;
  2.  
  3. import lombok.Data;
  4.  
  5. import javax.persistence.Id;
  6.  
  7. /**
  8. * Created by 孙义朗 on 2017/11/16 0016.
  9. */
  10. @Data
  11. public class Params {
  12. private String userId;
  13. private String userName;
  14. private String gender;
  15. private String age;
  16.  
  17. private String gradeName;
  18.  
  19. private String schoolName;
  20.  
  21. }

Params

Dao层

  1. package com.syl.demo.dao;
  2.  
  3. import com.syl.demo.daomain.Grade;
  4. import com.syl.demo.daomain.School;
  5. import com.syl.demo.daomain.User;
  6. import org.springframework.data.domain.Pageable;
  7. import org.springframework.data.jpa.domain.Specification;
  8. import org.springframework.data.jpa.repository.JpaRepository;
  9.  
  10. import java.util.List;
  11.  
  12. /**
  13. * Created by 孙义朗 on 2017/11/16 0016.
  14. */
  15. public interface UserRepository extends JpaRepository<User,String> {
  16. List<User> findAll();
  17.  
  18. List<User> findAll(Specification<User> spc, Pageable pageable);
  19.  
  20. }

UserRepository

Service及实现

  1. package com.syl.demo.service;
  2.  
  3. import com.syl.demo.daomain.Grade;
  4. import com.syl.demo.daomain.Params;
  5. import com.syl.demo.daomain.School;
  6. import com.syl.demo.daomain.User;
  7. import org.springframework.data.domain.Pageable;
  8. import org.springframework.data.jpa.domain.Specification;
  9.  
  10. import java.util.List;
  11.  
  12. /**
  13. * Created by 孙义朗 on 2017/11/16 0016.
  14. */
  15. public interface UserService {
  16. List<User> findAll();
  17.  
  18. List<User> findAll(int pageNum, int pageSize,User user);
  19.  
  20. List<User> findAll(int pageNum, int pageSize, Params params);
  21.  
  22. }

UserService

  1. package com.syl.demo.service.impl;
  2.  
  3. import com.syl.demo.dao.UserRepository;
  4. import com.syl.demo.daomain.Grade;
  5. import com.syl.demo.daomain.Params;
  6. import com.syl.demo.daomain.School;
  7. import com.syl.demo.daomain.User;
  8. import com.syl.demo.service.UserService;
  9. import org.apache.commons.lang3.StringUtils;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.data.domain.PageRequest;
  12. import org.springframework.data.domain.Pageable;
  13. import org.springframework.data.jpa.domain.Specification;
  14. import org.springframework.stereotype.Service;
  15.  
  16. import javax.persistence.criteria.*;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19.  
  20. /**
  21. * Created by 孙义朗 on 2017/11/16 0016.
  22. */
  23. @Service
  24. public class UserServiceImpl implements UserService {
  25. @Autowired
  26. private UserRepository userRepository;
  27.  
  28. @Override
  29. public List<User> findAll() {
  30. return userRepository.findAll();
  31. }
  32.  
  33. //查询User,单表,多条件
  34. @Override
  35. public List<User> findAll(int pageNum, int pageSize, User user) {
  36. Pageable pageable = new PageRequest(pageNum, pageSize);
  37. List<User> uList = userRepository.findAll(new Specification<User>() {
  38. @Override
  39. public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
  40. List<Predicate> predicates = new ArrayList<>();
  41. if (user.getUserId() != null && !user.getUserId().equals("")) {
  42. predicates.add(cb.like(root.get("userId").as(String.class), "%" + user.getUserId() + "%"));
  43. }
  44. if (user.getUserName() != null && !user.getUserName().equals("")) {
  45. predicates.add(cb.like(root.get("userName").as(String.class), "%" + user.getUserName() + "%"));
  46. }
  47. if (user.getGender() != null && !user.getGender().equals("")) {
  48. predicates.add(cb.like(root.get("gender").as(String.class), "%" + user.getGender() + "%"));
  49. }
  50. if (user.getAge() != null && !user.getAge().equals("")) {
  51. predicates.add(cb.like(root.get("age").as(String.class), "%" + user.getAge() + "%"));
  52. }
  53. Predicate[] pre = new Predicate[predicates.size()];
  54. criteriaQuery.where(predicates.toArray(pre));
  55. return cb.and(predicates.toArray(pre));
  56. }
  57. }, pageable);
  58.  
  59. return uList;
  60. }
  61.  
  62. //查询User,多表,多条件
  63. @Override
  64. public List<User> findAll(int pageNum, int pageSize, Params params) {
  65. Pageable pageable = new PageRequest(pageNum, pageSize);
  66. List<User> uList = userRepository.findAll(new Specification<User>() {
  67. @Override
  68. public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
  69. List<Predicate> list = new ArrayList<>();
  70. //根据userId 查询user
  71. if (StringUtils.isNotBlank(params.getUserId())) {
  72. list.add(cb.equal(root.get("userId").as(String.class), params.getUserId()));
  73. }
  74. //根据userName 模糊查询user
  75. if (StringUtils.isNotBlank(params.getUserName())) {
  76. list.add(cb.like(root.get("userName").as(String.class), "%" + params.getUserName() + "%"));
  77. }
  78. //根据gender 查询user
  79. if (StringUtils.isNotBlank(params.getGender())) {
  80. list.add(cb.equal(root.get("gender").as(String.class), params.getGender()));
  81. }
  82. //根据age>? 查询user
  83. if (StringUtils.isNotBlank(params.getAge())) {
  84. list.add(cb.gt(root.get("age").as(Integer.class), Integer.valueOf(params.getAge())));
  85. }
  86. //根据gradeName 查询user
  87. if (StringUtils.isNotBlank(params.getGradeName())) {
  88. Join<Grade, User> join = root.join("grade", JoinType.LEFT);
  89. list.add(cb.equal(join.get("gradeName"), params.getGradeName()));
  90. }
  91. //根据schoolName 查询user
  92. if (StringUtils.isNotBlank(params.getSchoolName())) {
  93. Join<School, User> join = root.join("grade", JoinType.LEFT);
  94. list.add(cb.equal(join.get("school").get("schoolName"), params.getSchoolName()));
  95. }
  96. Predicate[] pre = new Predicate[list.size()];
  97. criteriaQuery.where(list.toArray(pre));
  98. return cb.and(list.toArray(pre));
  99. }
  100. }, pageable);
  101.  
  102. return uList;
  103. }
  104.  
  105. }

UserServiceImpl

控制层

  1. package com.syl.demo.controller;
  2.  
  3. import com.syl.demo.daomain.Grade;
  4. import com.syl.demo.daomain.Params;
  5. import com.syl.demo.daomain.School;
  6. import com.syl.demo.daomain.User;
  7. import com.syl.demo.service.UserService;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.web.bind.annotation.*;
  10.  
  11. import java.util.List;
  12.  
  13. /**
  14. * Created by 孙义朗 on 2017/11/16 0016.
  15. */
  16. @RestController
  17. public class UserController {
  18. @Autowired
  19. UserService userService;
  20.  
  21. @GetMapping(value = "/getUser")
  22. public List<User> getUser() {
  23. List<User> uList = userService.findAll();
  24. return uList;
  25. }
  26.  
  27. //查询User,单表,多条件
  28. @PostMapping(value = "/getUser/{pageNum}/{pageSize}")
  29. public List<User> getUser(@PathVariable("pageNum") Integer pageNum,
  30. @PathVariable("pageSize") Integer pageSize,
  31. @RequestBody User user) {
  32. List<User> uList = userService.findAll(pageNum, pageSize, user);
  33. return uList;
  34. }
  35.  
  36. //查询User,多表,多条件
  37. @PostMapping(value = "/getUser2/{pageNum}/{pageSize}")
  38. public List<User> getUser2(@PathVariable("pageNum") Integer pageNum,
  39. @PathVariable("pageSize") Integer pageSize,
  40. @RequestBody Params params) {
  41. List<User> uList = userService.findAll(pageNum, pageSize, params);
  42. return uList;
  43. }
  44.  
  45. }

UserController

完成。

postman测试效果如下

(单表查询http://www.cnblogs.com/arrrrrya/p/7831248.html)

springboot jpa 多条件查询(多表)的更多相关文章

  1. springboot jpa 多条件查询(单表)

    需要实现的功能: 多个搜索输入框:全部不填,则查出所有列表:填了条件,就按条件查找:填的条件个数不定. 方法实现的核心:jpa自带的Specification<T> (目前只需要单表,多表 ...

  2. jpa多条件查询重写Specification的toPredicate方法(转)

    Spring Data JPA支持JPA2.0的Criteria查询,相应的接口是JpaSpecificationExecutor.Criteria 查询:是一种类型安全和更面向对象的查询 . 这个接 ...

  3. jpa多条件查询

    首先继承JpaSpecificationExecutor<T>接口 需要用到JpaSpecificationExecutor<T>中的Page<T> findAll ...

  4. Spring Boot Jpa 多条件查询+排序+分页

    事情有点多,于是快一个月没写东西了,今天补上上次说的. JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将 ...

  5. spring data jpa 组合条件查询封装

    /** * 定义一个查询条件容器 * @author lee * * @param <T> */ public class Criteria<T> implements Spe ...

  6. spring jpa : 多条件查询

    https://www.cnblogs.com/Donnnnnn/p/6277872.html 方式一: 第一步:EmpAccNumService package com.payease.scford ...

  7. springboot后端实现条件查询,要配合使用mybatis

    package cn.com.dyg.work.sqlgen; import cn.com.dyg.work.common.exception.DefException; import cn.com. ...

  8. springBoot JPA PageAble分页查询出错,PropertyReferenceException: No property creation found for type

    PropertyReferenceException: No property creation found for type @RequestParam(required = false, defa ...

  9. SpringBoot JPA + 分页 + 单元测试SpringBoot JPA条件查询

    application.properties 新增数据库链接必须的参数 spring.jpa.properties.hibernate.hbm2ddl.auto=update 表示会自动更新表结构,所 ...

随机推荐

  1. python 查找字符串同时包含数字和字母的最长子字符串的几种实现方法

    有个字符串$sd1#111$svda123!!!221&eSSDSDG,包含特殊字符.数字和字母,输出最长的子字符串和他的长度 例如上面的字符串同时包含数字和字母的字符串是svda123,长度 ...

  2. 廖雪峰Python学习笔记——使用元类

    元类(MetaClasses) 元类提供了一个改变Python类行为的有效方式. 元类的定义是“一个类的类”.任何实例是它自己的类都是元类. class demo(object): pass obj ...

  3. Greedy- 621. Task Scheduler

    Given a char array representing tasks CPU need to do. It contains capital letters A to Z where diffe ...

  4. 使用python进行短信轰炸

    本文作者:i春秋作家——Hacker1ee 大家好,我是1ee(因为在作家群,就不加Hacker这个前缀了,怕被大佬打..) 刚加入i春秋作家组希望大家多多关照,也欢迎大家找我交流 今天我来讲讲我最近 ...

  5. Storm的并行度

    在Storm集群中,运行Topolopy的实体有三个:工作进程,executor(线程),task(任务),下图可以形象的说明他们之间的关系. 工作进程 Storm集群中的一台机器会为一个或则多个To ...

  6. powerDesiner设计数据库的一些用法

    数据库的设计主要有以下几个步骤: 1:需求分析:根据业务需求分析出满足客户的需求,从而建立相应的数据库 2:概念设计:通过数据抽象,设计系统概念模型,一般为E-R模型:(entity-relation ...

  7. 【xsy1116】数学题 奥数题

    真实奥数题 题目大意:给你正整数k$,r$.问你存在多少对$(x,y)$,满足$x<y$且$x^2+y^2=kz^2$,并将所有符合条件的数对输出. 数据范围:$r≤1e9$,$k={1,2,3 ...

  8. manifest.xml

    main action 和 laucher的categoty If either the MAIN action or LAUNCHER category are not declared for o ...

  9. QuantLib 金融计算

    我的微信:xuruilong100 <Implementing QuantLib>译后记 QuantLib 金融计算 QuantLib 入门 基本组件之 Date 类 基本组件之 Cale ...

  10. L09-Linux系统修改网卡名称(eth1修改为eth0)

    一.环境 VirtualBox + CentOS6.5 二.问题 有时候在克隆服务器之后配置网络时,或者在维护别人建好的服务器时,会遇到这样一种情况.如下图所示:   即:在接口配置文件ifcfg-e ...