首页 > 其他分享 >Hibernate查询返回自定义对象

Hibernate查询返回自定义对象

时间:2023-04-28 15:04:32浏览次数:39  
标签:Hibernate 自定义 resultClass addScalar 查询 new query null


/**
     * Convert query result to vo list util class.
     */
    class AliasToBeanResultTransformer implements ResultTransformer {
        private static final long serialVersionUID = -5199190581393587893L;
        private final Class<T> resultClass;
        private Setter[] setters;
        private PropertyAccessor propertyAccessor;
        public AliasToBeanResultTransformer(Class<T> resultClass) {
            if (resultClass == null) throw new IllegalArgumentException("resultClass cannot be null");
            this.resultClass = resultClass;
            propertyAccessor = new ChainedPropertyAccessor(new PropertyAccessor[]{PropertyAccessorFactory.getPropertyAccessor(resultClass, null), PropertyAccessorFactory.getPropertyAccessor("field")});
        }
        public Object transformTuple(Object[] tuple, String[] aliases) {
            Object result;
            try {
                if (setters == null) {
                    setters = new Setter[aliases.length];
                    for (int i = 0; i < aliases.length; i++) {
                        String alias = convertColumnToProperty(aliases[i]);
                        if (alias != null) {
                            try {
                                setters[i] = propertyAccessor.getSetter(resultClass, alias);
                            } catch (PropertyNotFoundException e) {
                                continue;
                            }
                        }
                    }
                }
                result = resultClass.newInstance();
                for (int i = 0; i < aliases.length; i++) {
                    if (setters[i] != null) {
                        setters[i].set(result, tuple[i], null);
                    }
                }
            } catch (InstantiationException e) {
                throw new HibernateException("Could not instantiate resultclass: " + resultClass.getName());
            } catch (IllegalAccessException e) {
                throw new HibernateException("Could not instantiate resultclass: " + resultClass.getName());
            }
            return result;
        }
        /**
         * Converts the specified 'XXX_YYY_ZZZ'-like column name to its
         * 'xxxYyyZzz'-like Java property name.
         *
         * @param columnName the column name
         * @return the Java property name
         */
        public String convertColumnToProperty(String columnName) {
            columnName = columnName.toLowerCase();
            StringBuffer buff = new StringBuffer(columnName.length());
            StringTokenizer st = new StringTokenizer(columnName, "_");
            while (st.hasMoreTokens()) {
                buff.append(StringUtils.capitalize(st.nextToken()));
            }
            buff.setCharAt(0, Character.toLowerCase(buff.charAt(0)));
            return buff.toString();
        }
        @SuppressWarnings({ "rawtypes", "unchecked" })
		public List<T> transformList(List collection) {
            return collection;
	}
}

 

然后使用:

@SuppressWarnings("unchecked")
	public Collection<Table> findBy(final QueryObj queryObj) {
		final String sql = "SELECT nvl(t.e_year, '无') AS year,l.m AS month,nvl(t.status, 0) as status,"
			+ " t.create_emp_code as createEmpCode,t.create_date as createDate," 
			+ " t.update_emp_code as updateEmpCode,t.update_date as updateDate"
			+ " FROM (SELECT LEVEL m FROM dual CONNECT BY LEVEL <= 12) l"
			+ " LEFT OUTER JOIN table t ON l.m = t.e_month AND t.e_year = ? AND t.e_page = ?"
			+ " ORDER BY l.m ";
		final String year = "year";
		final Long page = 1;
		return (Collection<Table>) super.getHibernateTemplate().execute(
				new HibernateCallback() {
					public Object doInHibernate(Session session)
							throws HibernateException, SQLException {
						SQLQuery query = session
								.createSQLQuery(sql);
						query.setString(0, year);
						query.setLong(1, page);
						//这里用addScalar指定查询结果集字段转换,尤其是用到sql函数时第一个参数是as 别名,第二个是返回值的类型
						query.addScalar("year", Hibernate.STRING);
						query.addScalar("month", Hibernate.STRING);
						query.addScalar("status", Hibernate.LONG);
						query.addScalar("createEmpCode", Hibernate.STRING);
						query.addScalar("updateEmpCode", Hibernate.STRING);
						query.addScalar("createDate", Hibernate.DATE);
						query.addScalar("updateDate", Hibernate.DATE);
						//关键转换方法query.setResultTransformer,参数AliasToBeanResultTransformer(映射到的POJO类).
						query.setResultTransformer(new AliasToBeanResultTransformer(Table.class));
						//OK hibernate会自动映射过去,如果不用这个方法它返回的时候是Collection<Object>,所以不能起到转换的作用,在JBoss中运行查询时会报错的.
						return query.list();
					}
				});
	}

 

 PS:最后注意如果使用hibernate4 ,那么会替代hibernate3 的Hibernate.INTEGER的用法,

在Hibernate4中使用的方法是 StandardBasicTypes.INTEGER用法

标签:Hibernate,自定义,resultClass,addScalar,查询,new,query,null
From: https://blog.51cto.com/u_16092550/6234184

相关文章

  • aop实现日志记录通过自定义注解方式
    切面类切入点引入注解@Pointcut("@annotation(com.test.aop.MyLog)")privatevoidpointcut(){}注解类@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)//指定实现的类型及运行时机public@interfaceMyLog{}在使用的方法上加自定义注解@MyLog方法log.i......
  • 基于台风信息查询 API 设计台风预警系统的基本思路
    引言在过去的几十年中,由于全球气候变化等因素的影响,台风的强度和频率都有所增加,给人类社会带来了极大的威胁。在这种背景下,一个高效可靠的台风预警和监测系统显得尤为重要。这种系统可以通过获取、存储、处理和分析各种相关数据,来实现对台风的实时监测、预测和预警,并向相关部门和......
  • css cursor: url 自定义鼠标光标遇到的坑
    1、大小不能大于32*32(切记)本人就是在这个上面栽了很久,一直出不来2、最好是ico,cur格式3、使用绝对路径4、在逗号后面加通用游标,如官网所写 示例:map.style.cursor="url('/img/cursor.ico'),pointer";附:在线修改图片大小网址:在线图片大小修改器,图片尺寸修改,格式转换【免费】png等......
  • solr高亮显示和多索引字段查询
    Youcandirectlytestthe highlighting bypassingthehighlightparameters.e.g. hl=true&hl.fl=name,featuresAlso,youcanconfigurethehighlightdefaultswithinyourequesthandlerinsolrconfig.xmle.g.<requestHandlername="/browse"clas......
  • C/C++ 自定义结构体直接用自定义结构体=赋值
    自定义结构体中没有管理堆空间对象的指针structst_t{inta;shortb;charc;chars[128]={0};};对比使用=和memcpy的汇编代码 结论 两者均调用了memcpy,结构体中不带指针(管理堆空间),可以直接使用浅拷贝,不过个人倾向后者,显式调用memcpy。......
  • Sql Server 数据库事务与锁,同一事务更新又查询锁?期望大家来解惑
    我有一个People表,有三行数据:如果我们没详细了解数据库事务执行加锁的过程中,会不会有这样一个疑问:如下的这段SQL开启了事务,并且在事务中进行了更新和查询操作。BEGINTRAN updatePeoplesetName='张三'whereid=1; select*fromPeoplewhereid=1;committran我......
  • sed 指定范围内查询
    时间范围内的查询sed-n'/11:0718:29:20/,/11:0718:31:11/p'catalina.outsed-n'/11:0718:29:/,/11:0718:31:/p'catalina.out 为什么sed可以根据时间范围查询sed命令并不能直接根据时间范围查询,而是利用了时间戳出现的字符串匹配功能,从而找到包含指定时间戳范围内......
  • 【CPP】自定义排序--针对智能指针
    目录代码块代码块#include<iostream>#include<memory>#include<vector>#include<algorithm>usingnamespacestd;classBase{public:virtualvoidPrint(){std::cout<<"IamBase!\n";}};classDerived1:publi......
  • 深度了解group分组查询
    使用groupby的简单例子groupby工作原理groupby+where和groupby+having的区别groupby优化思路groupby使用注意点一个生产慢SQL如何优化1.使用groupby的简单例子groupby一般用于分组统计,它表达的逻辑就是根据一定的规则,进行分组。我们先从一个简单的例子......
  • 【动手学深度学习】第五章笔记:层与块、参数管理、自定义层、读写文件、GPU
    为了更好的阅读体验,请点击这里由于本章内容比较少且以后很显然会经常回来翻,因此会写得比较详细。5.1层和块事实证明,研究讨论“比单个层大”但“比整个模型小”的组件更有价值。例如,在计算机视觉中广泛流行的ResNet-152架构就有数百层,这些层是由层组(groupsoflayers)的重复模......