通过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();}
本人反射学得比较浅显,希望高手能够多多指点。
转载于:https://www.cnblogs.com/tangkai/p/3844920.html
通过Java反射做实体查询相关推荐
- java 反射获取实体类_Java 通过反射给实体类赋值操作
表单提交这个方法是挺方便的,但在java来说就显得有些麻烦了, 怎么个麻烦呢,就是当你字段多的时候,你就得一个一个的获取其对应的值,这样代码量就多了起来,其代码量不说,维护也是一个问题. 所以就有了这 ...
- java反射取实体字符串_JAVA反射机制 通过反射 Field类获取和修改对象类的字符串值...
实际编程中如果我们要使用系统中未暴露的方法,我们可以通过反射来使用这些方法,但在使用过程中我们很难确定方法对用的参数类型,以下的代码可以帮你得到这些信息: package cn.sunzn.refle ...
- java反射获取实体类_java 反射获取类对象的三种方式
Java反射经常用到的就是获取对象中的属性,那么Java获取类对象就是必不可少的啦! Java实体类: public class ReflexModel { private String code; ...
- android 遍历实体类,Java中遍历实体类(处理MongoDB)
在实际过程中,经常要将实体类进行封装,尤其是处理数据库的过程中:因此,对于遍历实体类能够与数据库中的一行数据对应起来. 我是使用的环境是Spring boot,访问的数据库时MongoDB 实体类遍历 ...
- 使用java反射写一个通用的jdbc查询
在后端开发中,我们经常和数据库打交道.从最开始的使用jdbc进化到框架(mybatis)我们的开发效率提升了很多,但是不知道你没有思考过框架是如何在日常的开发中帮助我们的? 在我之前的博客中,讨论过 ...
- Java后台管理应用:如何在树结构上做模糊查询?
开发企业后台管理应用时,经常会遇到一种场景:在树结构上做模糊查询. 比如:公司组织架构树.分类树等,通常是在页面上的文本框中输入一个关键字,例如"数据",然后在公司组织架构树中过滤 ...
- 转换实体类_利用Java反射机制进行Map和JavaBean间转换
Java中利用反射进行Map和JavaBean间转换 在日常工作中,有时候我们可能会遇到以下这样的情况发生. 例如: (1)后端接受一个参数Map param(可能是前端form维护的一个对象...) ...
- 做了6年的Java,mysql去重查询方法
前言: 求职季在即,技巧千万条,硬实力才是关键,听说今年疫情大环境不好,更要好好准备才行.MySQL是Java程序员面向高级的必备技能,很多朋友在面试时经常在这里折戟沉沙,饮恨不已.熟练掌握MySQL ...
- Java数据库开发与应用之MySQL数据库、JDBC操作数据库、C3P0数据库连接池,Java反射等
MySQL数据库,JDBC接口,MyBatis框架等,掌握的数据的存放和管理. Java数据库开发基础,介绍MySQL数据库.JDBC操作数据库.C3P0数据库连接池,Java反射等内容,进行油画商城 ...
最新文章
- 业务订单号生成算法,每秒50W左右,不同机器保证不重复,包含日期可读性好...
- 薪水增长多少,新机会才值得考虑?
- Git生成ssh密钥指定文件
- pdo一次插入多条数据的2种实现方式
- react 当前时间_React教程-State 生命周期
- Alphabet高管:移动搜索为收入主要增长点 广告形式改进长期获益
- NOIP2017 Day1 T1 小凯的疑惑
- ES6学习之Promise
- 跨境电商ERP的主要功能和模块
- 用MACD决策树模型预测股票趋势
- 网课答案公众号查询方法
- [BZOJ4152][AMPPZ2014]The Captain题解
- pacman / yaourt 命令
- 小程序开发.云数据库
- 家庭机器人要爆发?看客拍手叫好,戏子才知冷暖
- pH敏感聚乙二醇-聚甲基丙烯酸PEG-b-PDPA混合胶束-瑞禧
- manjaro 折腾总结
- STM32学习心得十七:窗口看门狗(WWDG)实验及旧知识点复习
- 软件测试之软件系统测试
- List集合常用方法总结
热门文章
- JAVA 编程开发入门-张晨光-专题视频课程
- 04-doucument对象属性和方法
- springboot中分页插件pageHelper的使用
- SMS短信通API——(1)Java应用发送手机短信
- 剑指offer 二进制中1的个数
- 考究Hadoop中split的计算方法
- TransmittableThreadLocal 解决 线程池线程复用 无法复制 InheritableThreadLocal 的问题.
- Tomcat源代码阅读系列之八:Tomcat 设计模式总结
- sh: react-scripts: command not found after running npm start
- vue.js中使用radio和checkbox