反射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 开发人员提供了一种 ...
随机推荐
- Eclipse中如何添加相对路径的外部jar包
在eclipse中进行java编程的时候,常常需要引用外部jar包.而采用相对路径引用jar包可以大大方便java工程的拷贝,这样使得java工程从一个路径转移到另一个路径时不用大费周章的修改外包ja ...
- Vant-Weap通过事件获取值
van-field框的使用 和通过事件获取值 <van-cell-group> <van-field value="{{username}}" label=&qu ...
- 关于AttributeError: 'NoneType' object has no attribute 'send_keys'
在学web自动化测试时,通过PO模型将特定页面的一些元素及元素操作放在特定页面模块中, 然后提取公共的部分, 如元素等待WebDriverWait, 元素操作send_keys, click, 获取元 ...
- [python / selenium] - 用python刷公选课是一种什么体验?
前言 看公选课还是能学到很多知识的,这里是给大家提供一个selenium的使用思路(好好学公选课,我真的看了) 思路 当观看者移动鼠标到某一范围时就会停止播放,就让selenium一直将鼠标悬停在视频 ...
- idea搜索不到任何插件
今天在idea安装插件的时候,突然发现,什么都搜索不到了?? 解决方案: 完活.
- C# 管道通信 (client —— server)Framework2.0版本也可用
//管道服务类public class PipServer { [DllImport("kernel32.dll", SetLastError = true)] public st ...
- linux中crontab任务调度
一.创建调度任务 指令 crontab -e 进入当前用户编辑界面 crontab -u 用户名 -e 进入指定用户编辑界面 进入crontab任务编辑界面 任务编写格式 #每分钟执行查看一次/ect ...
- cmdb项目-1
1.什么是cmdb 配置管理数据库 ,存储基础设备的各种信息配置等 CMDB可以存储并自动发现整个IT网络上的各种信息,比如一个IT网络上有多少台服务器.多少存储.设备的品牌.资产编号.维护人员.所属 ...
- Flutter学习笔记(19)--加载本地图片
如需转载,请注明出处:Flutter学习笔记(19)--加载本地图片 上一篇博客正好用到了本地的图片,记录一下用法: 首先新建一个文件夹,这个文件夹要跟目录下 然后在pubspec.yaml里面声明出 ...
- Postsql 修改字段长度和类型
以后更改字段长度会重写表,如果表比较大,那么表会加锁,需要很长时间 通过一种方法通过修改pg_attribute.atttypmod字段修改长度,不需要重写表 查询select * from pg_a ...