通过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 ...
随机推荐
- $(addprefix PREFIX,NAMES…)
addprefix 是makefile中的函数,是添加前缀的函数例如:$(addprefix src/,foo bar) 返回值为“src/foo src/bar”.所以上面的意思是为dirver_d ...
- LeetCode(125) Valid Palindrome
题目 Given a string, determine if it is a palindrome, considering only alphanumeric characters and ign ...
- ZZULIoj 1907 小火山的宝藏收益
Description 进去宝藏后, 小火山发现宝藏有N个房间,且这n个房间通过N-1道门联通. 每一个房间都有一个价值为Ai的宝藏, 但是每一个房间也都存在一个机关.如果小火山取走了这 ...
- wp8 longlistselector 动态加载datatemplate
在做一个windows phone 8 即时通讯应用的时候,聊天界面的对话气泡. 需要根据不同的消息类型,加载对应的DataTemplate, 比如发送,接受,图片,语音,等气泡. 如下图所示 会话界 ...
- SPOJ QTREE Query on a tree ——树链剖分 线段树
[题目分析] 垃圾vjudge又挂了. 树链剖分裸题. 垃圾spoj,交了好几次,基本没改动却过了. [代码](自带常数,是别人的2倍左右) #include <cstdio> #incl ...
- BZOJ 2595 [Wc2008]游览计划 ——斯坦纳树
[题目分析] 斯坦纳树=子集DP+SPFA? 用来学习斯坦纳树的模板. 大概就是用二进制来表示树包含的点,然后用跟几点表示树的形态. 更新分为两种,一种是合并两个子集,一种是换根,换根用SPFA迭代即 ...
- poj 1269 直线间的关系
Intersecting Lines Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9360 Accepted: 421 ...
- Android UI自定义Spinner下拉框(用popuwindow实现)-转
定义出第一个图片的布局和弹出框(一个listView)的布局,,这里就不在多说了~ListView需要自己定义一个MyspinnerAdapter~做好这些准备之后,就是弹出框的实现了~ prote ...
- elasticsearch入门使用(一)es 6.2.2安装,centos 7
elasticsearch(一般叫es)是基于Lucene的搜索服务器,提供http协议接口使用json格式数据,也提供相应的客户端,更详细的信息[优点&场景]请百度百科, 以下官网截图,官网 ...
- AC日记——香甜的黄油 codevs 2038
2038 香甜的黄油 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 农夫Jo ...