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 表示会自动更新表结构,所 ...
随机推荐
- python 查找字符串同时包含数字和字母的最长子字符串的几种实现方法
有个字符串$sd1#111$svda123!!!221&eSSDSDG,包含特殊字符.数字和字母,输出最长的子字符串和他的长度 例如上面的字符串同时包含数字和字母的字符串是svda123,长度 ...
- 廖雪峰Python学习笔记——使用元类
元类(MetaClasses) 元类提供了一个改变Python类行为的有效方式. 元类的定义是“一个类的类”.任何实例是它自己的类都是元类. class demo(object): pass obj ...
- Greedy- 621. Task Scheduler
Given a char array representing tasks CPU need to do. It contains capital letters A to Z where diffe ...
- 使用python进行短信轰炸
本文作者:i春秋作家——Hacker1ee 大家好,我是1ee(因为在作家群,就不加Hacker这个前缀了,怕被大佬打..) 刚加入i春秋作家组希望大家多多关照,也欢迎大家找我交流 今天我来讲讲我最近 ...
- Storm的并行度
在Storm集群中,运行Topolopy的实体有三个:工作进程,executor(线程),task(任务),下图可以形象的说明他们之间的关系. 工作进程 Storm集群中的一台机器会为一个或则多个To ...
- powerDesiner设计数据库的一些用法
数据库的设计主要有以下几个步骤: 1:需求分析:根据业务需求分析出满足客户的需求,从而建立相应的数据库 2:概念设计:通过数据抽象,设计系统概念模型,一般为E-R模型:(entity-relation ...
- 【xsy1116】数学题 奥数题
真实奥数题 题目大意:给你正整数k$,r$.问你存在多少对$(x,y)$,满足$x<y$且$x^2+y^2=kz^2$,并将所有符合条件的数对输出. 数据范围:$r≤1e9$,$k={1,2,3 ...
- manifest.xml
main action 和 laucher的categoty If either the MAIN action or LAUNCHER category are not declared for o ...
- QuantLib 金融计算
我的微信:xuruilong100 <Implementing QuantLib>译后记 QuantLib 金融计算 QuantLib 入门 基本组件之 Date 类 基本组件之 Cale ...
- L09-Linux系统修改网卡名称(eth1修改为eth0)
一.环境 VirtualBox + CentOS6.5 二.问题 有时候在克隆服务器之后配置网络时,或者在维护别人建好的服务器时,会遇到这样一种情况.如下图所示: 即:在接口配置文件ifcfg-e ...