反射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 开发人员提供了一种 ...
随机推荐
- 用python暴力破解压缩文件并不是万能,至少这个场景我告诉你密码你用代码也破解不了
看到论坛上各种贴子写用python进行暴力破解的文章,于是自己也想去尝试一下,不试不知道,一试吓一跳,真的就像那句有名的”python由入门到放弃“,把论坛上别人的脚本全部自己敲一遍,运行不报错,但也 ...
- Softmax用于手写数字识别(Tensorflow实现)-个人理解
softmax函数的作用 对于分类方面,softmax函数的作用是从样本值计算得到该样本属于各个类别的概率大小.例如手写数字识别,softmax模型从给定的手写体图片像素值得出这张图片为数字0~9 ...
- pytest系列(一):什么是单元测试界的高富帅?
pytest是python语言中一款强大的单元测试框架,用来管理和组织测试用例,可应用在单元测试.自动化测试工作中. unittest也是python语言中一款单元测试框架,但是功能有限,没有pyte ...
- 八、VTK安装并运行一个例子
一.版本 win10 VS2019 VTK8.2.0 其实vtk的安装过程和itk的安装过程很是类似,如果你对itk的安装很是熟悉(也就是我的博客一里面的内容,那么自己就可以安装.) 如果不放心,可以 ...
- laravel中间件的使用
简介HTTP 中间件提供了为过滤进入应用的 HTTP 请求提供了一套便利的机制.例如,Laravel 内置了一个中间件来验证用户是否经过授权,如果用户没有经过授权,中间件会将用户重定向到登录页面,否则 ...
- jQuery-点击返回顶部
在页面上,有时需要点击某个图标钮实现返回顶部的效果. 实现方式如下,给图标按钮增加名叫goTop-hook的类. // 点击返回顶部 $(window).scroll(function() { if ...
- 浅谈Kotlin中的函数
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/UV23Uw_969oVhiOdo4ZKAw作者:连凌能 Kotlin,已经被Android官方 ...
- Python 从入门到进阶之路(四)
之前的文章我们简单介绍了一下 Python 的几种变量类型,本篇文章我们来看一下 Python 中的函数. 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性, ...
- 关于hover与after,before已及first-letter,first-line的联用
0920自我总结 关于hover与after,before已及first-letter,first-line的联用 一.写法 元素:hover::after{样式} 元素:hover::before{ ...
- Set a Many-to-Many Relationship设置多对多关系 (EF)
In this lesson, you will learn how to set relationships between business objects. For this purpose, ...