springboot jpa 多条件查询(多表)
前几天写的,贴上来。
实体类。
package com.syl.demo.daomain; import lombok.Data; import javax.persistence.*; /**
* Created by 孙义朗 on 2017/10/31.
*/
@Entity
@Data
public class User {
@Id
private String userId;
private String userName;
private String password;
private String gender;//性别
private String age;
@ManyToOne
private School school;
@ManyToOne
private Grade grade;
}
User
package com.syl.demo.daomain; import lombok.Data; import javax.jws.soap.SOAPBinding;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany; /**
* Created by 孙义朗 on 2017/10/31.
*/
@Data
@Entity
public class School {
@Id
private String schoolId;
private String schoolName; }
School
package com.syl.demo.daomain; import lombok.Data; import javax.persistence.*; /**
* Created by 孙义朗 on 2017/11/16.
*/
@Entity
@Data
public class Grade {
@Id
private String gradeId;
private String gradeName;
@ManyToOne
private School school; }
Grade
还有一个封装查询条件的类
package com.syl.demo.daomain; import lombok.Data; import javax.persistence.Id; /**
* Created by 孙义朗 on 2017/11/16 0016.
*/
@Data
public class Params {
private String userId;
private String userName;
private String gender;
private String age; private String gradeName; private String schoolName; }
Params
Dao层
package com.syl.demo.dao; import com.syl.demo.daomain.Grade;
import com.syl.demo.daomain.School;
import com.syl.demo.daomain.User;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; /**
* Created by 孙义朗 on 2017/11/16 0016.
*/
public interface UserRepository extends JpaRepository<User,String> {
List<User> findAll(); List<User> findAll(Specification<User> spc, Pageable pageable); }
UserRepository
Service及实现
package com.syl.demo.service; import com.syl.demo.daomain.Grade;
import com.syl.demo.daomain.Params;
import com.syl.demo.daomain.School;
import com.syl.demo.daomain.User;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification; import java.util.List; /**
* Created by 孙义朗 on 2017/11/16 0016.
*/
public interface UserService {
List<User> findAll(); List<User> findAll(int pageNum, int pageSize,User user); List<User> findAll(int pageNum, int pageSize, Params params); }
UserService
package com.syl.demo.service.impl; import com.syl.demo.dao.UserRepository;
import com.syl.demo.daomain.Grade;
import com.syl.demo.daomain.Params;
import com.syl.demo.daomain.School;
import com.syl.demo.daomain.User;
import com.syl.demo.service.UserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import javax.persistence.criteria.*;
import java.util.ArrayList;
import java.util.List; /**
* Created by 孙义朗 on 2017/11/16 0016.
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository; @Override
public List<User> findAll() {
return userRepository.findAll();
} //查询User,单表,多条件
@Override
public List<User> findAll(int pageNum, int pageSize, User user) {
Pageable pageable = new PageRequest(pageNum, pageSize);
List<User> uList = userRepository.findAll(new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<>();
if (user.getUserId() != null && !user.getUserId().equals("")) {
predicates.add(cb.like(root.get("userId").as(String.class), "%" + user.getUserId() + "%"));
}
if (user.getUserName() != null && !user.getUserName().equals("")) {
predicates.add(cb.like(root.get("userName").as(String.class), "%" + user.getUserName() + "%"));
}
if (user.getGender() != null && !user.getGender().equals("")) {
predicates.add(cb.like(root.get("gender").as(String.class), "%" + user.getGender() + "%"));
}
if (user.getAge() != null && !user.getAge().equals("")) {
predicates.add(cb.like(root.get("age").as(String.class), "%" + user.getAge() + "%"));
}
Predicate[] pre = new Predicate[predicates.size()];
criteriaQuery.where(predicates.toArray(pre));
return cb.and(predicates.toArray(pre));
}
}, pageable); return uList;
} //查询User,多表,多条件
@Override
public List<User> findAll(int pageNum, int pageSize, Params params) {
Pageable pageable = new PageRequest(pageNum, pageSize);
List<User> uList = userRepository.findAll(new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<>();
//根据userId 查询user
if (StringUtils.isNotBlank(params.getUserId())) {
list.add(cb.equal(root.get("userId").as(String.class), params.getUserId()));
}
//根据userName 模糊查询user
if (StringUtils.isNotBlank(params.getUserName())) {
list.add(cb.like(root.get("userName").as(String.class), "%" + params.getUserName() + "%"));
}
//根据gender 查询user
if (StringUtils.isNotBlank(params.getGender())) {
list.add(cb.equal(root.get("gender").as(String.class), params.getGender()));
}
//根据age>? 查询user
if (StringUtils.isNotBlank(params.getAge())) {
list.add(cb.gt(root.get("age").as(Integer.class), Integer.valueOf(params.getAge())));
}
//根据gradeName 查询user
if (StringUtils.isNotBlank(params.getGradeName())) {
Join<Grade, User> join = root.join("grade", JoinType.LEFT);
list.add(cb.equal(join.get("gradeName"), params.getGradeName()));
}
//根据schoolName 查询user
if (StringUtils.isNotBlank(params.getSchoolName())) {
Join<School, User> join = root.join("grade", JoinType.LEFT);
list.add(cb.equal(join.get("school").get("schoolName"), params.getSchoolName()));
}
Predicate[] pre = new Predicate[list.size()];
criteriaQuery.where(list.toArray(pre));
return cb.and(list.toArray(pre));
}
}, pageable); return uList;
} }
UserServiceImpl
控制层
package com.syl.demo.controller; import com.syl.demo.daomain.Grade;
import com.syl.demo.daomain.Params;
import com.syl.demo.daomain.School;
import com.syl.demo.daomain.User;
import com.syl.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import java.util.List; /**
* Created by 孙义朗 on 2017/11/16 0016.
*/
@RestController
public class UserController {
@Autowired
UserService userService; @GetMapping(value = "/getUser")
public List<User> getUser() {
List<User> uList = userService.findAll();
return uList;
} //查询User,单表,多条件
@PostMapping(value = "/getUser/{pageNum}/{pageSize}")
public List<User> getUser(@PathVariable("pageNum") Integer pageNum,
@PathVariable("pageSize") Integer pageSize,
@RequestBody User user) {
List<User> uList = userService.findAll(pageNum, pageSize, user);
return uList;
} //查询User,多表,多条件
@PostMapping(value = "/getUser2/{pageNum}/{pageSize}")
public List<User> getUser2(@PathVariable("pageNum") Integer pageNum,
@PathVariable("pageSize") Integer pageSize,
@RequestBody Params params) {
List<User> uList = userService.findAll(pageNum, pageSize, params);
return uList;
} }
UserController
完成。
postman测试效果如下

(单表查询http://www.cnblogs.com/arrrrrya/p/7831248.html)
springboot jpa 多条件查询(多表)的更多相关文章
- springboot jpa 多条件查询(单表)
需要实现的功能: 多个搜索输入框:全部不填,则查出所有列表:填了条件,就按条件查找:填的条件个数不定. 方法实现的核心:jpa自带的Specification<T> (目前只需要单表,多表 ...
- jpa多条件查询重写Specification的toPredicate方法(转)
Spring Data JPA支持JPA2.0的Criteria查询,相应的接口是JpaSpecificationExecutor.Criteria 查询:是一种类型安全和更面向对象的查询 . 这个接 ...
- jpa多条件查询
首先继承JpaSpecificationExecutor<T>接口 需要用到JpaSpecificationExecutor<T>中的Page<T> findAll ...
- Spring Boot Jpa 多条件查询+排序+分页
事情有点多,于是快一个月没写东西了,今天补上上次说的. JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将 ...
- spring data jpa 组合条件查询封装
/** * 定义一个查询条件容器 * @author lee * * @param <T> */ public class Criteria<T> implements Spe ...
- spring jpa : 多条件查询
https://www.cnblogs.com/Donnnnnn/p/6277872.html 方式一: 第一步:EmpAccNumService package com.payease.scford ...
- springboot后端实现条件查询,要配合使用mybatis
package cn.com.dyg.work.sqlgen; import cn.com.dyg.work.common.exception.DefException; import cn.com. ...
- springBoot JPA PageAble分页查询出错,PropertyReferenceException: No property creation found for type
PropertyReferenceException: No property creation found for type @RequestParam(required = false, defa ...
- SpringBoot JPA + 分页 + 单元测试SpringBoot JPA条件查询
application.properties 新增数据库链接必须的参数 spring.jpa.properties.hibernate.hbm2ddl.auto=update 表示会自动更新表结构,所 ...
随机推荐
- LeetCode142:Linked List Cycle II
题目: Given a linked list, return the node where the cycle begins. If there is no cycle, return null. ...
- TransactionScope事务使用
using (System.Transactions.TransactionScope T_Scope = new System.Transactions.TransactionScope()) { ...
- Gzip压缩和解压
/// <summary> /// 将传入字符串以GZip算法压缩后,返回Base64编码字符 /// </summary> /// <param name=" ...
- 在Docker中运行纸壳CMS并配置使用MySql
纸壳CMS是基于ASP.Net Core开发的可视化内容管理系统,可以跨平台部署,可以在容器中运行.接下来看看如何在docker中运行纸壳CMS. GitHub:https://github.com/ ...
- 前端入门CSS(1)
day48 参考:https://www.cnblogs.com/liwenzhou/p/7999532.html CSS的几种引入方式 行内样式 行内式是在标记的style属性中设定CSS样式,不推 ...
- Windows 内核漏洞学习—空指针解引用
原标题:Windows Kernel Exploitation – NullPointer Dereference 原文地址:https://osandamalith.com/2017/06/22/w ...
- JVM中的对象生命周期
在JVM运行空间中,对象的整个生命周期大致可以分为七个阶段:创建阶段(Creation).应用阶段(Using).不可视阶段(Invisible).不可到达阶段( Unreachable).可收集阶段 ...
- Linux之开源软件移植
移植环境 Utuntu 15.04 1.mplayer移植 版本:mplayer-export-snapshot.tar.bz2 /mplayer-export-2015-11-26 Linux PC ...
- Linux命令学习与使用2
1.Ctrl+a:跳到命令行首 Ctrl+E: 跳到命令行尾 Ctrl+L:清屏2.切换用户 su - 用户名3.更换yum镜像源 1.进入/etc/yum.repos.d 备份CentOS-Base ...
- SSH版最大会话连接数
在登录方法中加入如下两行语句,作为程序的入口: SessionListener.isAlreadyEnter(getHttpRequest().getSession(),this.getUserCod ...