通过Java反射做实体查询
我们在使用hibernate的时候,查询的时候都会和实体中的一些字段相结合去查询,当然字段少了,还算是比较简单,当字段多了,就不那么容易了,所以就自己写了个方法,根据实体中的字段信息去查询,废话不多说上代码:
/**
* 根据实体查询,将所有的参数封装到实体中查询即可,不可查询为null的信息
* @param t
* @return
* @throws SecurityException
* @throws NoSuchMethodException
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public List<T> queryAll(T t) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
//存放参数
List<Object> paraList = new ArrayList<Object>();
List<T> list = new ArrayList<T>();
StringBuffer sb = new StringBuffer("from ");
sb.append(entityClass.getSimpleName()).append(" where 1=1 ");
if( t == null){
list = find(sb.toString());
return list;
}
//拼接hql语句
//获取类中所有的属性
Field[] fields = t.getClass().getDeclaredFields();
for(Field field : fields){
//字段名称
String fieldName = field.getName();
//方法名称
String methodName = getMethodName(fieldName, "get");
//方法
Method method = UserInfo.class.getDeclaredMethod(methodName);
//方法的返回值类型
String methodReturnType = method.getReturnType().getSimpleName();
Object obj = null;
obj = method.invoke(t);
//返回值为空则跳过
if( obj == null ){
continue;
}
if ("String".equals(methodReturnType)) {
String str = String.valueOf(obj.toString());
sb.append(" and ").append(fieldName).append("= ? ");
paraList.add(str);
} else if ("Date".equals(methodReturnType)) {
Date date = (Date)obj;
sb.append(" and ").append(fieldName).append("= ? ");
paraList.add(date);
} else if ("Integer".equals(methodReturnType)
|| "int".equals(methodReturnType)) {
Integer i = Integer.valueOf(obj.toString());
sb.append(" and ").append(fieldName).append("= ? ");
paraList.add(i);
} else if ("Long".equalsIgnoreCase(methodReturnType)) {
Long L = Long.valueOf(obj.toString());
sb.append(" and ").append(fieldName).append("= ? ");
paraList.add(L);
} else if ("Double".equalsIgnoreCase(methodReturnType)) {
Double d = Double.valueOf(obj.toString());
sb.append(" and ").append(fieldName).append("= ? ");
paraList.add(d);
} else if ("Boolean".equalsIgnoreCase(methodReturnType)) {
Boolean b = Boolean.valueOf(obj.toString());
sb.append(" and ").append(fieldName).append("= ? ");
paraList.add(b);
}
}
Query query = createQuery(sb.toString(), paraList.toArray());
list = query.list();
return list;
} /**
* 或实体中属性的get或set方法
* @param methodName 字段名
* @param methodType 方法类型:get或set
* @return
*/
private String getMethodName(String methodName, String methodType){
if( methodName == null || "".equals(methodName.trim()) ){
return null;
}
StringBuffer sb = new StringBuffer();
sb.append(methodType);
sb.append(methodName.substring(0, 1).toUpperCase());
sb.append(methodName.substring(1));
return sb.toString();
}
本人反射学得比较浅显,希望高手能够多多指点。
通过Java反射做实体查询的更多相关文章
- java反射对实体类取值和赋值,可以写成通过实体类获取其他元素的数据,很方便哦~~~
项目中需要过滤前面表单页面中传过来的实体类的中的String类型变量的前后空格过滤,由于前几天看过一个其他技术博客的的java反射讲解,非常受益.于是,哈哈哈 public static <T& ...
- java反射对实体类取值和赋值
public static void checkDesignerEdit(Object dtos) throws Exception { Class dtosClass = dtos.getClass ...
- java反射遍历实体类属性和类型,并赋值和获取值
/* * GetModelNameAndType.java * Version 1.0.0 * Created on 2017年12月15日 * Copyright ReYo.Cn */ packag ...
- Java 反射实现实体转Map时,父类元素丢失
public class BeanToMap { public static Map<String, Object> ConvertObjToMap(Object obj) { Map&l ...
- [转]C#反射,根据反射将数据库查询数据和实体类绑定,并未实体类赋值
本文来自:http://www.cnblogs.com/mrchenzh/archive/2010/05/31/1747937.html /****************************** ...
- java反射获取和设置实体类的属性值 递归所有父类
最近做一个通用数据操作接口,需要动态获取和设置实体类的属性值,为了通用实体做了多重继承,开始网上找到代码都不支持父类操作,只能自己搞一个工具类了,此工具类可以设置和获取所有父类属性,代码贴下面拿走不谢 ...
- jdk8新特性:在用Repository实体查询是总是提示要java.util.Optional, 原 Inferred type 'S' for type parameter 'S' is not within its bound;
jdk8新特性:在用Repository实体查询是总是提示要java.util.Optional 在使用springboot 方法报错: Inferred type 'S' for type para ...
- 利用Java反射机制对实体类的常用操作工具类ObjectUtil
代码: ObjectUtil类: import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.Simpl ...
- Java进阶(六)Java反射机制可恶问题NoSuchFieldException
作为一种重要特性,Java反射机制在很多地方会用到.在此做一小结,供朋友们参考. 首先从一个问题开始着手. 可恶的问题又来了,NoSuchFieldException,如下图所示: 完全不知道这个qu ...
随机推荐
- Java总结输入流输出流
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群:618528494 我们一起学Java! 1.什么是IO Java中I/O操作主要是指使用 ...
- Oracle跟踪分析数据库启动的各个阶段
目录 启动到nomount状态 设置trace 启动数据库到mount状态并打开 查阅trace 查阅trace的另外方法 v$diag_info 视图 演示如下: 启动到nomount状态 SYS@ ...
- 五、docker配置镜像加速器之阿里云
1 配置docker加速器 实在忍受不了pull的速度--------- 访问网址: https://dev.aliyun.com/search.html 点击管理中心: 根据操作稳定配置:
- Charlie's Change(完全背包记录路径)
Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffe ...
- POJ 1502 MPI Maelstrom【floyd】
题目大意:求点1到所有点最短路径的最大值 思路:水题,单源最短路,网上解题清一色dijkstra,但是点数小于100显然floyd更简洁嘛 #include<cstdio> #includ ...
- 【图论】bnuoj 52810 Splitting the Empire
acm.bnu.edu.cn/v3/contest_show.php?cid=9208#problem/G [题意] 给定一个无向图,要求把这个无向图的点划分到不同的集合里,使得每个集合的点之间两两没 ...
- polya burnside 专题
polya题目:uva 11077 Find the Permutationsuva 10294 Arif in DhakaLA 3641 Leonardo's Notebookuva 11077 F ...
- Codevs 3111 CYD啃骨头
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description: CYD吃饭时有N个骨头可以啃,但CYD要午睡了,所以他只有M分钟吃饭,已知 ...
- net8:文本文件的创建及其读写
原文发布时间为:2008-08-06 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...
- gitweb 搭建教程
1. 前言 git 是一个版本控制工具,类似svn. 本文内容主要涉及git仓库通过浏览器访问(用web的方式去查看git提交历史记录,tag,branch等信息),即gitweb. 效果图: 在这里 ...