反射2-spring boot jpa 注入model即实现查询
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即实现查询的更多相关文章
- Spring Boot + JPA 多模块项目无法注入 JpaRepository 接口
问题描述 Spring Boot + JPA 多模块项目,启动报异常: nested exception is org.springframework.beans.factory.NoSuchBean ...
- Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题
(转载)Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题 这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执 ...
- Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例
Spring Boot(十五):spring boot+jpa+thymeleaf增删改查示例 一.快速上手 1,配置文件 (1)pom包配置 pom包里面添加jpa和thymeleaf的相关包引用 ...
- Spring Boot JPA 连接数据库
本文将介绍怎样在Spring Boot project中加入JPA作为持久化方式. 改动 pom.xml 依赖 与上一篇介绍的 jdbc 不同的是 spring-boot-starter-jdbc 改 ...
- Spring Boot Jpa 表名小写转大写
今天在使用SpringBoot整合Hibernate后创建表,表名为小写,而在linux下,mysql的表名是区分大小写的,因此在我的数据表中,就出现了两个一样的表 act_id_user 和 AC ...
- 【快学springboot】7.使用Spring Boot Jpa
jpa简介 Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据. ...
- spring boot jpa 使用update 报错解决办法
在spring boot jpa 中自定义sql,执行update操作报错解决办法: 在@Query(...)上添加 @Modifying@Transactional注解
- Spring Boot(五):Spring Boot Jpa 的使用
在上篇文章Spring Boot(二):Web 综合开发中简单介绍了一下 Spring Boot Jpa 的基础性使用,这篇文章将更加全面的介绍 Spring Boot Jpa 常见用法以及注意事项. ...
- Spring Boot Jpa 的使用
Spring Boot Jpa 介绍 首先了解 Jpa 是什么? Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种 ...
随机推荐
- Pinpoint-agent监控springboot编译的jar启动方式
由于springboot在打包发版时已经将tomcat容器内嵌到jar文件中,可以通过以下命令来使pinpoint-agent监控生成的jar服务 java -javaagent:D:\Softwar ...
- centos7.6 jumpserver 堡垒机 重启启动顺序
cd /sdata/usr/local python3. -m venv py3 source /sdata/usr/local/py3/bin/activate cd /sdata/usr/loca ...
- selenium原理应用 - 利用requests模拟selenium驱动浏览器
前言 selenium是一个web自动化测试的开源框架,它支持多语言:python/java/c#… 前面也有一篇文章说明了,selenium+浏览器的环境搭建. selenium支持多语言,是因为s ...
- 几行代码轻松实现PHP文件打包下载zip
<?php //获取文件列表 function list_dir($dir){ $result = array(); if (is_dir($dir)){ $file_dir = scandir ...
- 备用APC队列
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 备用APC队列 占坑:这一节跟进程挂靠相关联,我们先把进程挂靠给 ...
- 【LeetCode】6. Z 字形变换
题目 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C ...
- Slickflow.NET 开源工作流引擎高级开发(五) -- 引擎和外部事件的交互
前言:引擎组件的基本职责是负责流程流转,但是在流转过程中,除了对内部控制逻辑进行实现外,也不可避免的要去调用或者响应外部事件.本文主要描述外部事件的类型,以及调用方法过程. 1. 外部事件的类型 外部 ...
- PHP发送短信
1.要拼接接收的手机号和短信 public function sendcode() { $parpm = input(); $valist = $this->validate($parpm, [ ...
- 池化HttpClient,拿去就能用
import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpEntity; import org.apache.http.HttpResp ...
- SVN 回滚提交的代码
有的时候,代码提交错了,我们可以通过SVN回滚到指定的版本,然后在提交回滚后的代码,即为撤销提交. 回滚代码 重新提交刚才回滚后的代码