`
jsczxy2
  • 浏览: 1268862 次
  • 性别: Icon_minigender_1
  • 来自: 常州
文章分类
社区版块
存档分类
最新评论

Hibernate查询返回自定义对象

阅读更多
    /**
     * 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用法

分享到:
评论
1 楼 olddoor 2015-12-24  
要不要这么帅

相关推荐

    hibernate自定义查询

    Hibernate支持使用`createSQLQuery`方法创建SQL查询,并返回结果集。例如: ```java Session session = sessionFactory.openSession(); SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM USER WHERE ...

    hibernate将本地SQL查询结果封装成对象

    以上代码会返回一个Object数组列表,每个数组元素对应一条记录,需要手动将它们转换为自定义的对象。 总结起来,Hibernate的本地SQL查询功能为我们提供了一种灵活的方式来执行复杂的数据库操作,同时通过`addEntity...

    hibernate + 自定义标签分页

    在实际应用中,通常在后台Controller层(对应Struts的Action),通过Hibernate查询数据库获取数据时,会调用`PagerHelper` 来创建`Pager` 对象,然后在JSP页面中,使用自定义的`&lt;pageTag&gt;` 标签来展示分页信息和...

    简要分析Java的Hibernate框架中的自定义类型

    当我们发现Hibernate默认的数据类型无法满足我们存储数据的特殊要求时,例如需要处理复杂对象或者自定义逻辑时,就可以通过自定义类型进行解决。 自定义类型主要有两种实现方式: 1. 实现`UserType`接口:这是最...

    hibernate将本地SQL查询结果封装成对象(最终).zip

    - 结果集转换:`addEntity()`方法用于指定查询结果应被映射到哪个实体类,`list()`或`scroll()`方法执行查询并返回结果集,这些结果集将自动封装为对应的Java对象。 5. 示例: 假设我们有一个`User`实体类,对应...

    解决Hibernate对于Date类型的数据返回结果中时分秒不对的问题

    在使用Hibernate进行数据库操作时,有时会遇到一个常见的问题,即当从数据库中查询Date类型的数据并由Hibernate返回时,发现结果中的时分秒部分不正确。这个问题通常源于多个因素,包括日期时间的序列化与反序列化...

    Struts+Hibernate+自定义标签的网上书店

    **Struts、Hibernate和自定义标签在构建网上书店系统中的应用** 本网上书店系统是一个基于MVC(Model-View-Controller)设计模式的Web应用程序,它整合了Java的两大核心框架——Struts和Hibernate,以及自定义标签...

    hibernate实现动态SQL查询

    在Hibernate中,我们可以创建自定义的SQL查询语句并将其配置在映射文件(.hbm.xml)中。这些自定义SQL可以在需要时动态调用,从而实现动态查询。例如,我们可以为一个实体类定义多个HQL或SQL查询,根据实际需要选择...

    Hibernate_实体类_注解_说明

    Hibernate作为Java领域中流行的ORM(对象关系映射)框架,提供了丰富的注解来简化实体类与数据库表之间的映射。本文将深入解析一系列关键注解,帮助理解Hibernate如何实现这一过程。 #### 1. `@Entity`与`@Table` ...

    Hibernate查询方法之探析.doc

    HQL是Hibernate特有的面向对象的查询语言,类似于SQL但以对象和属性为主。例如,`String hql = "select s.name ,avg(s.age) from Student s group by s.name"`,此查询将返回每个学生姓名及其平均年龄,通过`session...

    Hibernate中的查询:HQL、Criteria、原生SQl

    原生SQL查询可以返回结果集、单个值或自定义的结果类型。但需要注意的是,这种方式可能会丢失一些Hibernate的自动转换和事务管理功能。 总结,Hibernate提供了多种查询方式以适应不同场景的需求。HQL适用于大多数...

    Hibernate hql查询语法总结

    查询结果通常为`Object[]`数组,可以通过自定义封装将其转换为更具体的对象。 总之,Hibernate HQL提供了丰富的查询功能,使得开发者能够以面向对象的方式处理数据库操作,大大提高了开发效率。通过熟练掌握HQL,...

    hibernate 调用oracle函数

    Hibernate作为一个优秀的Java ORM(对象关系映射)框架,极大地简化了Java应用与数据库之间的交互。Oracle则作为一款强大的关系型数据库管理系统,广泛应用于企业级应用中。本文将深入探讨如何在Hibernate中调用...

    hibernate的缓存机制和session对象的产生方式案例

    当同样的查询被执行多次时,Hibernate会首先查看查询缓存,如果缓存中有结果,则直接返回,无需再次执行SQL。不过,查询缓存对数据一致性要求较高,一旦数据更新,可能需要清理相关查询结果的缓存。 接下来,我们...

    springmvc+hibernate+spring maven案例(包含分页查询)

    - 在此案例中,可能使用了Hibernate的`Criteria`或`HQL`查询语言配合`PageRequest`或自定义分页实现,通过指定页码和每页大小来获取特定范围的数据。 6. **文件名:user** - "user"可能是数据库中的一个表名,...

    hibernate公共查询

    - `listAll()`: 查询所有记录,使用`Session`的`createCriteria()`或`createQuery()`方法构造HQL(Hibernate Query Language)或SQL,然后调用`list()`执行并返回结果集。 - `findById(id)`: 根据ID查询单个对象...

    Hibernate SQLQuery 本地查询

    在Java的持久化框架Hibernate中,SQLQuery是用于执行自定义SQL语句的重要工具,它允许开发者绕过ORM(对象关系映射)的抽象层,直接与数据库进行交互。这篇博客"Hibernate SQLQuery 本地查询"可能详细讲解了如何利用...

    Hibernate实例 oracel数据库

    在Hibernate项目中,我们可以使用JUnit测试数据的插入、更新、查询和删除操作,确保数据库操作的正确性。 8. **自定义测试类**: 自定义测试类通常是为了模拟特定场景或功能的测试,可能包含更复杂的数据状态设置和...

    java Hibernate ireport jsperreport 制作报表

    当Hibernate查询返回的是对象元组时,可以创建一个如下的`HibernateQueryResultDataSource`类,它将每个数组元素映射到报表字段: ```java public class HibernateQueryResultDataSource implements JRDataSource...

    hibernate分页查询

    Hibernate,作为一个流行的Java对象关系映射(ORM)框架,为开发者提供了便捷的分页查询功能。让我们深入探讨Hibernate分页查询的相关知识点。 一、Hibernate分页原理 Hibernate分页查询基于SQL的LIMIT和OFFSET子句...

Global site tag (gtag.js) - Google Analytics