通过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 ...
随机推荐
- errno的定义
./include/asm-generic/errno-base.h -->包含errno=~ ./arch/arm/include/asm/errno.h -->包含/include/a ...
- $(addprefix PREFIX,NAMES…)
addprefix 是makefile中的函数,是添加前缀的函数例如:$(addprefix src/,foo bar) 返回值为“src/foo src/bar”.所以上面的意思是为dirver_d ...
- int (*a)[10] 和 int *a[10] 的区别
int *a[10] :指针数组.数组a里存放的是10个int型指针 int (*a)[10] :数组指针.a是指针,指向一个数组.此数组有10个int型元素 int *a[10] 先找到声明符a,然 ...
- POJ 2955 区间DP Brackets
求一个括号的最大匹配数,这个题可以和UVa 1626比较着看. 注意题目背景一样,但是所求不一样. 回到这道题上来,设d(i, j)表示子序列Si ~ Sj的字符串中最大匹配数,如果Si 与 Sj能配 ...
- Knockout v3.4.0 中文版教程-8-计算监控-纯计算属性
4.纯计算属性 纯计算监控在KO 3.2.0中开始引入,比大多数应用程序使计算监控有更大的性能提升和内存优化.这是因为在自身没有订阅的时候不会保持订阅状态.特性如下 阻止内存泄露 - 避免在应用程序里 ...
- LongListSelector 控件 在 wp7 和wp8中的不同之处
众所周知,wp8中的LongListSelector集成到了Rom中. 性能得到了提升,一些api也发生了变化. 在这里总结一下,作为分享,也作为备忘. 参考文献 Windows Phone 8 XA ...
- 【LeetCode】Unique Email Addresses(独特的电子邮件地址)
这道题是LeetCode里的第929道题. 题目要求: 每封电子邮件都由一个本地名称和一个域名组成,以 @ 符号分隔. 例如,在 alice@leetcode.com中, alice 是本地名称,而 ...
- ubuntu ssh连接服务器保持长时间不断
方法: ssh -o serveraliveinterval=60 username@ip
- [git 学习篇] git remote add origin错误
http://blog.csdn.net/dengjianqiang2011/article/details/9260435 如果输入$ Git remote add origin git@githu ...
- 如何使用百度地图API
一.申请密钥 1.先用eclipse创建一个Android工程 2.在百度api官网上申请一个密钥,链接:http://lbsyun.baidu.com/apiconsole/key 二.工程配置 1 ...