/** * 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用法
相关推荐
以上代码会返回一个Object数组列表,每个数组元素对应一条记录,需要手动将它们转换为自定义的对象。 总结起来,Hibernate的本地SQL查询功能为我们提供了一种灵活的方式来执行复杂的数据库操作,同时通过`addEntity...
Hibernate支持使用`createSQLQuery`方法创建SQL查询,并返回结果集。例如: ```java Session session = sessionFactory.openSession(); SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM USER WHERE ...
在实际应用中,通常在后台Controller层(对应Struts的Action),通过Hibernate查询数据库获取数据时,会调用`PagerHelper` 来创建`Pager` 对象,然后在JSP页面中,使用自定义的`<pageTag>` 标签来展示分页信息和...
当我们发现Hibernate默认的数据类型无法满足我们存储数据的特殊要求时,例如需要处理复杂对象或者自定义逻辑时,就可以通过自定义类型进行解决。 自定义类型主要有两种实现方式: 1. 实现`UserType`接口:这是最...
- 结果集转换:`addEntity()`方法用于指定查询结果应被映射到哪个实体类,`list()`或`scroll()`方法执行查询并返回结果集,这些结果集将自动封装为对应的Java对象。 5. 示例: 假设我们有一个`User`实体类,对应...
在使用Hibernate进行数据库操作时,有时会遇到一个常见的问题,即当从数据库中查询Date类型的数据并由Hibernate返回时,发现结果中的时分秒部分不正确。这个问题通常源于多个因素,包括日期时间的序列化与反序列化...
**Struts、Hibernate和自定义标签在构建网上书店系统中的应用** 本网上书店系统是一个基于MVC(Model-View-Controller)设计模式的Web应用程序,它整合了Java的两大核心框架——Struts和Hibernate,以及自定义标签...
在Hibernate中,我们可以创建自定义的SQL查询语句并将其配置在映射文件(.hbm.xml)中。这些自定义SQL可以在需要时动态调用,从而实现动态查询。例如,我们可以为一个实体类定义多个HQL或SQL查询,根据实际需要选择...
Hibernate作为Java领域中流行的ORM(对象关系映射)框架,提供了丰富的注解来简化实体类与数据库表之间的映射。本文将深入解析一系列关键注解,帮助理解Hibernate如何实现这一过程。 #### 1. `@Entity`与`@Table` ...
HQL是Hibernate特有的面向对象的查询语言,类似于SQL但以对象和属性为主。例如,`String hql = "select s.name ,avg(s.age) from Student s group by s.name"`,此查询将返回每个学生姓名及其平均年龄,通过`session...
原生SQL查询可以返回结果集、单个值或自定义的结果类型。但需要注意的是,这种方式可能会丢失一些Hibernate的自动转换和事务管理功能。 总结,Hibernate提供了多种查询方式以适应不同场景的需求。HQL适用于大多数...
查询结果通常为`Object[]`数组,可以通过自定义封装将其转换为更具体的对象。 总之,Hibernate HQL提供了丰富的查询功能,使得开发者能够以面向对象的方式处理数据库操作,大大提高了开发效率。通过熟练掌握HQL,...
Hibernate作为一个优秀的Java ORM(对象关系映射)框架,极大地简化了Java应用与数据库之间的交互。Oracle则作为一款强大的关系型数据库管理系统,广泛应用于企业级应用中。本文将深入探讨如何在Hibernate中调用...
当同样的查询被执行多次时,Hibernate会首先查看查询缓存,如果缓存中有结果,则直接返回,无需再次执行SQL。不过,查询缓存对数据一致性要求较高,一旦数据更新,可能需要清理相关查询结果的缓存。 接下来,我们...
- 在此案例中,可能使用了Hibernate的`Criteria`或`HQL`查询语言配合`PageRequest`或自定义分页实现,通过指定页码和每页大小来获取特定范围的数据。 6. **文件名:user** - "user"可能是数据库中的一个表名,...
- `listAll()`: 查询所有记录,使用`Session`的`createCriteria()`或`createQuery()`方法构造HQL(Hibernate Query Language)或SQL,然后调用`list()`执行并返回结果集。 - `findById(id)`: 根据ID查询单个对象...
在Java的持久化框架Hibernate中,SQLQuery是用于执行自定义SQL语句的重要工具,它允许开发者绕过ORM(对象关系映射)的抽象层,直接与数据库进行交互。这篇博客"Hibernate SQLQuery 本地查询"可能详细讲解了如何利用...
在Hibernate项目中,我们可以使用JUnit测试数据的插入、更新、查询和删除操作,确保数据库操作的正确性。 8. **自定义测试类**: 自定义测试类通常是为了模拟特定场景或功能的测试,可能包含更复杂的数据状态设置和...
当Hibernate查询返回的是对象元组时,可以创建一个如下的`HibernateQueryResultDataSource`类,它将每个数组元素映射到报表字段: ```java public class HibernateQueryResultDataSource implements JRDataSource...
Hibernate,作为一个流行的Java对象关系映射(ORM)框架,为开发者提供了便捷的分页查询功能。让我们深入探讨Hibernate分页查询的相关知识点。 一、Hibernate分页原理 Hibernate分页查询基于SQL的LIMIT和OFFSET子句...