我们在使用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反射做实体查询相关推荐

  1. java 反射获取实体类_Java 通过反射给实体类赋值操作

    表单提交这个方法是挺方便的,但在java来说就显得有些麻烦了, 怎么个麻烦呢,就是当你字段多的时候,你就得一个一个的获取其对应的值,这样代码量就多了起来,其代码量不说,维护也是一个问题. 所以就有了这 ...

  2. java反射取实体字符串_JAVA反射机制 通过反射 Field类获取和修改对象类的字符串值...

    实际编程中如果我们要使用系统中未暴露的方法,我们可以通过反射来使用这些方法,但在使用过程中我们很难确定方法对用的参数类型,以下的代码可以帮你得到这些信息: package cn.sunzn.refle ...

  3. java反射获取实体类_java 反射获取类对象的三种方式

    Java反射经常用到的就是获取对象中的属性,那么Java获取类对象就是必不可少的啦! Java实体类: public class ReflexModel { private String code; ...

  4. android 遍历实体类,Java中遍历实体类(处理MongoDB)

    在实际过程中,经常要将实体类进行封装,尤其是处理数据库的过程中:因此,对于遍历实体类能够与数据库中的一行数据对应起来. 我是使用的环境是Spring boot,访问的数据库时MongoDB 实体类遍历 ...

  5. 使用java反射写一个通用的jdbc查询

    在后端开发中,我们经常和数据库打交道.从最开始的使用jdbc进化到框架(mybatis)我们的开发效率提升了很多,但是不知道你没有思考过框架是如何在日常的开发中帮助我们的? 在我之前的博客中,讨论过 ...

  6. Java后台管理应用:如何在树结构上做模糊查询?

    开发企业后台管理应用时,经常会遇到一种场景:在树结构上做模糊查询. 比如:公司组织架构树.分类树等,通常是在页面上的文本框中输入一个关键字,例如"数据",然后在公司组织架构树中过滤 ...

  7. 转换实体类_利用Java反射机制进行Map和JavaBean间转换

    Java中利用反射进行Map和JavaBean间转换 在日常工作中,有时候我们可能会遇到以下这样的情况发生. 例如: (1)后端接受一个参数Map param(可能是前端form维护的一个对象...) ...

  8. 做了6年的Java,mysql去重查询方法

    前言: 求职季在即,技巧千万条,硬实力才是关键,听说今年疫情大环境不好,更要好好准备才行.MySQL是Java程序员面向高级的必备技能,很多朋友在面试时经常在这里折戟沉沙,饮恨不已.熟练掌握MySQL ...

  9. Java数据库开发与应用之MySQL数据库、JDBC操作数据库、C3P0数据库连接池,Java反射等

    MySQL数据库,JDBC接口,MyBatis框架等,掌握的数据的存放和管理. Java数据库开发基础,介绍MySQL数据库.JDBC操作数据库.C3P0数据库连接池,Java反射等内容,进行油画商城 ...

最新文章

  1. 业务订单号生成算法,每秒50W左右,不同机器保证不重复,包含日期可读性好...
  2. 薪水增长多少,新机会才值得考虑?
  3. Git生成ssh密钥指定文件
  4. pdo一次插入多条数据的2种实现方式
  5. react 当前时间_React教程-State 生命周期
  6. Alphabet高管:移动搜索为收入主要增长点 广告形式改进长期获益
  7. NOIP2017 Day1 T1 小凯的疑惑
  8. ES6学习之Promise
  9. 跨境电商ERP的主要功能和模块
  10. 用MACD决策树模型预测股票趋势
  11. 网课答案公众号查询方法
  12. [BZOJ4152][AMPPZ2014]The Captain题解
  13. pacman / yaourt 命令
  14. 小程序开发.云数据库
  15. 家庭机器人要爆发?看客拍手叫好,戏子才知冷暖
  16. pH敏感聚乙二醇-聚甲基丙烯酸PEG-b-PDPA混合胶束-瑞禧
  17. manjaro 折腾总结
  18. STM32学习心得十七:窗口看门狗(WWDG)实验及旧知识点复习
  19. 软件测试之软件系统测试
  20. List集合常用方法总结

热门文章

  1. JAVA 编程开发入门-张晨光-专题视频课程
  2. 04-doucument对象属性和方法
  3. springboot中分页插件pageHelper的使用
  4. SMS短信通API——(1)Java应用发送手机短信
  5. 剑指offer 二进制中1的个数
  6. 考究Hadoop中split的计算方法
  7. TransmittableThreadLocal 解决 线程池线程复用 无法复制 InheritableThreadLocal 的问题.
  8. Tomcat源代码阅读系列之八:Tomcat 设计模式总结
  9. sh: react-scripts: command not found after running npm start
  10. vue.js中使用radio和checkbox