spring boot jpa 
使用方法:
将对应的model类注入即可
// fixed parameter type
private Specification<TargetModel> findByConditionSpecification(TargetModel formalParameter) {
return new Specification<TargetModel>() { // fixed parameter type
@Override
public Predicate toPredicate(Root<TargetModel> root, CriteriaQuery<?> query,
CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<Predicate>();
// fixed parameter type
Class clsEmployeeBase = TargetServiceImpl.class; Method[] methods = clsEmployeeBase.getDeclaredMethods();
try {
for (Method method : methods) {
if (method.getName().equals("findByConditionSpecification")) {
Class clsEmployee = formalParameter.getClass();
Field[] fields = clsEmployee.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if (!"serialVersionUID".equals(field.getName()) && field.get(formalParameter) != null) {
switch (field.getName()) {
case "id": {
// TODO fixed parameter,formal patameter primary key
TargetIdentity id = (TargetIdentity) field.get(formalParameter);
Field[] idFields = id.getClass().getDeclaredFields();
for (Field idField : idFields) {
idField.setAccessible(true);
if (!"serialVersionUID".equals(idField.getName())
&& idField.get(id) != null) { String paramType = String.valueOf(idField.getType()).split(" ")[1];
switch (paramType) {
case "java.lang.String": {
String[] strs = String.valueOf(idField.get(id)).split(",");
Expression<String> express = root.get("id").get(idField.getName());
CriteriaBuilder.In<String> in = criteriaBuilder.in(express);
Arrays.asList(strs).forEach(n -> {
in.value(n);
});
predicates.add(in);
break;
}
case "java.util.Date": {
if (idField.getName().contains("start")) {
Expression<Date> express = root.get("id")
.get(idField.getName());
predicates.add(criteriaBuilder.greaterThanOrEqualTo(express,
(Date) (idField.get(id))));
break;
} if (idField.getName().contains("end")) {
Expression<Date> express = root.get("id")
.get(idField.getName());
predicates.add(criteriaBuilder.lessThanOrEqualTo(express,
(Date) (idField.get(id))));
break;
} } default: {
Expression express = root.get("id").get(idField.getName());
predicates.add(criteriaBuilder.equal(express, idField.get(id)));
break; }
} }
} break;
}
// 非联合主键
default: {
String paramType = String.valueOf(field.getType()).split(" ")[1];
switch (paramType) {
case "java.lang.String": {
String[] strs = String.valueOf(field.get(formalParameter)).split(",");
Expression<String> express = root.get(field.getName());
CriteriaBuilder.In<String> in = criteriaBuilder.in(express);
Arrays.asList(strs).forEach(n -> {
in.value(n);
});
predicates.add(in);
break;
}
case "java.util.Date": {
if (field.getName().contains("start")) {
Expression<Date> express = root.get(field.getName());
predicates.add(criteriaBuilder.greaterThanOrEqualTo(express,
(Date) (field.get(formalParameter))));
break;
} if (field.getName().contains("end")) {
Expression<Date> express = root.get(field.getName());
predicates.add(criteriaBuilder.lessThanOrEqualTo(express,
(Date) (field.get(formalParameter))));
break;
} } default: {
Expression express = root.get(field.getName());
predicates.add(criteriaBuilder.equal(express, field.get(formalParameter)));
break; }
}
break;
}
} } }
}
} } catch (Exception e) {
// TODO: handle exception
}
query.where(predicates.toArray(new Predicate[predicates.size()]));
return query.getRestriction();
}
}; }

反射2-spring boot jpa 注入model即实现查询的更多相关文章

  1. Spring Boot + JPA 多模块项目无法注入 JpaRepository 接口

    问题描述 Spring Boot + JPA 多模块项目,启动报异常: nested exception is org.springframework.beans.factory.NoSuchBean ...

  2. Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题

      (转载)Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题   这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执 ...

  3. Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例

    Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例 一.快速上手 1,配置文件 (1)pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 ...

  4. Spring Boot JPA 连接数据库

    本文将介绍怎样在Spring Boot project中加入JPA作为持久化方式. 改动 pom.xml 依赖 与上一篇介绍的 jdbc 不同的是 spring-boot-starter-jdbc 改 ...

  5. Spring Boot Jpa 表名小写转大写

    今天在使用SpringBoot整合Hibernate后创建表,表名为小写,而在linux下,mysql的表名是区分大小写的,因此在我的数据表中,就出现了两个一样的表 act_id_user 和  AC ...

  6. 【快学springboot】7.使用Spring Boot Jpa

    jpa简介 Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据. ...

  7. spring boot jpa 使用update 报错解决办法

    在spring boot jpa 中自定义sql,执行update操作报错解决办法: 在@Query(...)上添加 @Modifying@Transactional注解

  8. Spring Boot(五):Spring Boot Jpa 的使用

    在上篇文章Spring Boot(二):Web 综合开发中简单介绍了一下 Spring Boot Jpa 的基础性使用,这篇文章将更加全面的介绍 Spring Boot Jpa 常见用法以及注意事项. ...

  9. Spring Boot Jpa 的使用

    Spring Boot Jpa 介绍 首先了解 Jpa 是什么? Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种 ...

随机推荐

  1. Linux_更改时区和利用Crontab同步时间

    一.更改时区 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 二.Crontab时间同步 crontab -e   #crontab编辑 */5 ...

  2. Centos7_sl命令跑火车

    一.更新yum源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo 二.安装sl命令 yum ...

  3. 以太网驱动的流程浅析(三)-ifconfig的-19错误最底层分析【原创】

    以太网驱动流程浅析(三)-ifconfig的-19错误最底层分析 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号以及& ...

  4. Map随笔:最常用的Map——HashMap

    目录 Map随笔:最常用的Map--HashMap 前言: 1,HashMap的结构 2,HashMap的一些属性(JDK8) 3,HashMap的构造函数(JDK8) 4,HashMap的一些方法( ...

  5. tensor的加减乘和矩阵乘法

    对应的代码如下 import torch """如下是tensor乘法与加减法,对应位相乘或相加减,可以一对多""" def add_and ...

  6. Navicat Premium连接mongodb基本使用和介绍

    Navicat premium是一款数据库管理工具,是一个可多重连线资料库的管理工具, 它可以让你以单一程式同时连线到 MySQL.SQLite.Oracle 及 PostgreSQL,mongodb ...

  7. PHP 将某个http地址的远程图片下载到本地的某个目录

    代码: function getImage($url,$save_dir='',$filename='',$type=0){ if(trim($url)==''){ return array('fil ...

  8. [Spring cloud 一步步实现广告系统] 3. 网关路由

    Zuul(Router and Filter) WIKI: 传送门 作用 认证,鉴权(Authentication/Security) 预判(Insights) 压力测试(Stress Testing ...

  9. linux创建用户并锁定用户目录和首次登陆强制修改密码

    1.     创建用户及访问目录 mkdir -p /home/user/testuser   创建用户目录 useradd testuser -d /home/user/testuser  -M   ...

  10. OAuth2、OpenID Connect简介

    当我们在登录一些网站的时候,需要第三方的登录.比如,现在我们要登录简书https://www.jianshu.com/sign_in,我们使用微博登录,点击下方的一个微博的小按钮,就会出现这么一个地址 ...