通过Java反射做实体查询
生活随笔
收集整理的這篇文章主要介紹了
通过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反射做实体查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sublime3 ctl+b无效
- 下一篇: 【Java】Java Socket编程(