通过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反射做实体查询

时间: 2024-12-10 03:18:04

通过Java反射做实体查询的相关文章

java反射对实体类取值和赋值

项目中需要过滤前面表单页面中传过来的实体类的中的String类型变量的前后空格过滤,由于前几天看过一个其他技术博客的的java反射讲解,非常受益.于是,哈哈哈 public static <T> void modelTrim(T model){ Class<T> clazz = (Class<T>) model.getClass(); //获取所有的bean中所有的成员变量 Field[] fields = clazz.getDeclaredFields(); for(

Java反射获取实体的所有可见属性值,返回Object数组

获取实体的所有可见属性值 以下代码提供了两种实现,一种是基于List,一种是基于Map; 基于List的实现更节省内存,更高效一些:如果你有其它特殊的需求,可以根据实际参考以下代码进行扩展,或许有需要用到Map的情况呢! 当然,使用BeanUtils.describe或PropertyUtils.describe一两句代码就搞定了,但还需要额外添加包引用:另外效率方面是不是更高呢?我没有做过测试. /** * 获取实体的所有可见属性值 * @param object 实体类的实例 * @retu

java反射机制例子,反编译,以及通过读取配置文件降低耦合

本文不多做文字描述,通过代码可以说明一切,简单直观. //这边以反编译String类为例子,将反编译结果输入到文件. 1.ReflectTest.java 1 import java.io.File; 2 import java.io.FileReader; 3 import java.io.FileWriter; 4 import java.lang.reflect.Constructor; 5 import java.lang.reflect.Field; 6 import java.lan

[转]C#反射,根据反射将数据库查询数据和实体类绑定,并未实体类赋值

本文来自:http://www.cnblogs.com/mrchenzh/archive/2010/05/31/1747937.html /***************************************** * 说明:利用反射将数据库查询的内容自动绑定 *       到实体类 * * 时间:1:49 2009-9-19 * * 程序员:王文壮 * ***************************************/ /****************数据库脚本***

利用spring注解做类似Java反射机制

前言:一直觉得spring提供的注解装配bean机制非常的好,尤其是在做类似Java反射机制的时候太方便了,下面就依据项目需求进行一次记录,方便以后使用. 需求一句话:为每家交易所自动加载指定的结算银行. 需求分析:项目中需要适配很多家交易所,而每家交易所都有自己指定的结算银行,或者一家或者多家,那么项目在A交易所运行时,能够自动加载A家交易所指定的结算银行A1.A2,项目在B交易所运行时,能够自动加载B家交易所指定的结算银行B1. 解决方案:1.通过配置文件为项目确定交易所的结算银行 #A b

使用JAVA反射的利与弊

在Java的20周年的纪念日的日子里,让我们来重新温习下Java里面的高级知识,Java肯定希望大家了解她,要不然你跟她天天相濡以沫了这么长时间,让她知道你竟然不了解她,不在乎她,那么她该有多伤心呢,所以我们不应该做一个负心汉,更不应该做一个忘恩负义的人,她教会了你生存的技能,所以我们也应该将她发扬光大! Java的核心技能有如下几项:  (1)JVM的调优  (2)类加载器  (3)反射  (4)动态编译  (5)动态代理  (6)注解  (7)多线程  (8)IO,NIO,Socket,Ch

Java进阶 六 Java反射机制可恶问题NoSuchFieldException

作为一种重要特性,Java反射机制在很多地方会用到.在此做一小结,供朋友们参考. 首先从一个问题开始着手. 可恶的问题又来了,NoSuchFieldException,如下图所示: 完全不知道这个question是从哪里来的.以前也遇到过这样的问题,后来解决了,但是没有写文档,再次相遇这样的问题,傻了. 经过上网一番查找,发现遇到这个问题的小盆友还真不少,这个问题是属于java反射机制里的. 这是一个反射对象时候的异常,已经被捕获了的.这个报错代码是混淆了的,是不是这个question对象被混淆

Java 反射详解

反射反射,程序员的快乐,今天你快乐了吗?如果你不快乐,没关系,接下来让你快乐起来! 一.什么是反射? 通过百度百科我们可以知道,Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:并且能改变它的属性.而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C

java反射机制(一)—— 利用反射机制实例化对象

一.Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载.探知.使用编译期间完全未知的classes.换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体.或对其fields设值.或唤起其methods.(度娘文库是这么说的) 二.这篇文章主要介绍一下通过反射机制去实例化一个类的对象,然后调用其方法.本文主要介绍两种方式,第一种就是通过构造函数来实例化,第二种就是通过Cl