通过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 ...
随机推荐
- (转)在Xcode 7上直接使用Clang Address Sanitizer
原文地址: http://www.cocoachina.com/ios/20150730/12830.html WWDC 2015上,除了Swift 2.0外,还有一个令人激动的消息:可以直接在Xco ...
- BRVAH(让RecyclerView变得更高效) (2)
本文来自网易云社区 作者:吴思博 1.2 宫格和列表的混排样式 关于 Grid 和List 的混排样式,Grid 样式是一行有多个,而 List样式是一行只有一个. 我们可以把 List 样式看成是G ...
- CodeForces 321C Ciel the Commander
Ciel the Commander Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForc ...
- [uiautomator篇]recent
def Recent(self): d = Device('9410519008004c22098b') displayWidth = int(d.info.get("displayWidt ...
- POJ 2403 Hay Points
Hay Points Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5735 Accepted: 3695 Descri ...
- shell的echo命令
echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串.命令格式: echo arg 您可以使用echo实现更复杂的输出格式控制. 显示转义字符 echo "\"It ...
- [Vijos1308]埃及分数(迭代加深搜索 + 剪枝)
传送门 迭代加深搜索是必须的,先枚举加数个数 然后搜索分母 这里有一个强大的剪枝,就是确定分母的范围 #include <cstdio> #include <cstring> ...
- 2017NOIP初赛游记
前天晚上,玩三国杀,玩到了昨天凌晨2点40多分吧,我觉得初赛要爆炸了, 不得不吐槽一下,三国杀的武将太少了. 昨天是初赛的日子,上午8点多来了后看了看阅读程序和程序填空,复习了以下理论知识和wsj 然 ...
- cf701E Connecting Universities
Treeland is a country in which there are n towns connected by n - 1 two-way road such that it's poss ...
- 改变input的value值,同时在HTML中将value进行改变
在使用lodop进行打印的时候,需求中有这样一个功能:某个字段可以在页面的input框中进行修改. 但是在进行打印时调用的是静态的HTML代码,这就导致在页面的input框中改变字段之后,但是HTML ...