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. 字典 dict方法

    字典 student = {'sId': '1101', 'sName': '张三', 'sClass': '软件测试', 'sColl': '信息技术学院'} # 根据键查询 若不存在会报错 pri ...

  2. sql server编写脚本求解第1天1分钱之后每天两倍持续一个月的等比数列问题

    一.问题 问题1 场景:如果你未来的丈母娘要求你,第1天给她1分钱,第2天给2分钱,第3天给4分钱,以此类推,每天给前一天的2倍,给1个月(按30天)算就行.问:第30天给多少钱,总共给多少钱? 问题 ...

  3. Nginx 简介与安装、常用的命令和配置文件

    1.nginx 简介(1)介绍 nginx 的应用场景和具体可以做什么事情 (2)介绍什么是反向代理 (3)介绍什么是负载均衡 (4)介绍什么是动静分离 2.nginx 安装(1)介绍 nginx 在 ...

  4. QT Creator: The process could not be started!

    如果往工程里面增加了uac.manifest 文件后,QT creator不通过管理员启动的话,若要debug程序的话,就会提示 “The process could not be started!” ...

  5. qt 自定义控件窗口提升

  6. 【java】项目中的类名改变

    如果已经开发了一段时间,那如何一次性修改所有文件中的该类类名呢,一个个改太麻烦了还浪费时间,匹配关键字又怕误伤. 选中项目中需要改变的类,按F2键 重命名后eclipse会自动修改.

  7. C - Train Problem II——卡特兰数

    题目链接_HDU-1023 题目 As we all know the Train Problem I, the boss of the Ignatius Train Station want to ...

  8. FLV提取AAC音频单独播放并实现可视化的频谱

    如上图,要实现对FLV直播流中音频的识别,并展示成一个音频相关的动态频谱. 一. 首先了解下什么是声音? 能量波,有频率有振幅,频率高低就是音调,振幅大小就是音量:采样率是对频率采样,采样精度是对幅度 ...

  9. PHP中发送qq邮件

    <?php namespace app\home\logic; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Except ...

  10. Add a Class from the Business Class Library从业务类库添加类(EF)

    In this lesson, you will learn how to use business classes from the Business Class Library as is. Fo ...