package com.util; import java.lang.reflect.Field; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.property.ChainedPropertyAccessor; import org.hibernate.property.PropertyAccessor; import org.hibernate.property.PropertyAccessorFactory; import org.hibernate.property.Setter; import org.hibernate.transform.ResultTransformer; public class ColumnToBeanTransformer implements ResultTransformer { private static final long serialVersionUID = 1L; private Class resultClass = null; private Setter[] setters = null; private PropertyAccessor propertyAccessor = null; public ColumnToBeanTransformer(Class 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") }); } @Override public List transformList(List arg0) { return arg0; } @Override 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 = aliases[i]; if (alias != null) { setters[i] = getSetterByColumnName(alias); } } } result = resultClass.newInstance(); for (int i = 0; i < aliases.length; i++) { if (setters[i] != null && tuple[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; } private Setter getSetterByColumnName(String alias) { Field[] fields = resultClass.getDeclaredFields(); if (fields == null || fields.length == 0) { throw new RuntimeException("no properties set in " + resultClass.getName()); } String proName = alias.replaceAll("_", "").toLowerCase(); for (Field field : fields) { if (field.getName().toLowerCase().equals(proName)) { return propertyAccessor.getSetter(resultClass, field.getName()); } } throw new RuntimeException("cannot find corresponding property for column: " + alias); } }
相关推荐
这个查询加载了关联的 kitten 实体,并将其与 cat 实体关联起来。 四、返回标量值 使用 createSQLQuery 方法可以返回一个简单的标量值,例如: ```java Double max = (Double) sess.createSQLQuery("select max...
与 createQuery 方法不同的是,createSqlQuery 方法可以执行查询、修改和添加操作。 使用 createSqlQuery 方法可以执行以下操作: 1. 查询操作:使用 createSqlQuery 方法可以执行查询操作,例如: String sql = ...
例如,如果我们有一个User类,它有id和name属性,可以这样做: ```java List<User> users = sqlQuery.addEntity(User.class).list(); ``` 这样,查询结果将被自动封装成User对象的列表。然而,如果只想映射查询...
- **问题**: 在使用 HQL 或者 Native SQL 查询时,如果绑定的参数类型与数据库字段的类型不符,也会导致异常。 - **原因**: 如果查询条件中的参数类型与数据库字段的类型不匹配,Hibernate 将无法正确地执行类型转换...
1. **语法风格**:HQL更加面向对象,语法结构与Java类及其属性紧密相关;而NSQL则遵循标准SQL语法。 2. **类型安全**:HQL支持类型安全的参数绑定,而NSQL则需要显式指定参数类型。 3. **可移植性**:HQL由于其面向...
在上面的代码中,我们使用 setResultTransformer() 方法将查询结果转换为 Map 对象,每个 Map 对象的 KEY 是数据库中的字段名,VALUE 是该字段的值。 Transformers.ALIAS_TO_ENTITY_MAP 是 Hibernate 中的一个转换...
例如,在给定的部分内容中提到的私有整型字段,可以理解为某个实体类的一个属性。 **示例代码:** ```java public class 范类 { private Integer 字段; // Getter 和 Setter 方法 public Integer get字段() { ...
Hibernate是Java平台下的一款优秀对象关系映射(ORM)框架,它极大地简化了Java应用程序与数据库之间的交互过程。然而,在使用Hibernate执行SQL查询时,如果查询的目标表中存在char类型的字段,Hibernate有时会将该...
原生SQL查询可能返回单一标量值或混合标量值与实体的结果。例如,查询猫的最大体重: ```java Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat") .addScalar(...
在这里,`id`、`name`和`age`被分别映射到`TUser`类的相应属性。 此外,为了遵循某些团队的编码规范,避免在代码中直接写SQL语句,你可以在Hibernate的配置文件中定义SQL查询。例如: ```xml select {usr.*} ...
6. **使用`@DynamicUpdate`**:在实体类上使用`@DynamicUpdate`注解,Hibernate会根据实际变更的字段生成更新语句,而非全字段更新,但请注意这可能增加数据库查询复杂度。 四、最佳实践 在实际开发中,应结合业务...
在 Hibernate 中,使用 SQLQuery 可以执行 Native SQL 查询,控制查询的执行是通过 SQLQuery 接口进行的,通过执行 Session.createSQLQuery() 获取这个接口。下面将详细介绍如何使用这个 API 进行查询。 标量查询...
这里通过 `Example.create()` 方法创建了一个基于对象样例的查询,可以查询与样例对象具有相同属性值的对象。 2. **通过 Restrictions 创建查询**: ```java Criteria cri = session.createCriteria...
每个实体类都有一个对应的映射文件,其中定义了属性与数据库字段的映射关系。 - **注解映射**: 现代Hibernate更倾向于使用注解进行映射,这样可以将元数据直接嵌入到实体类中,使得代码更加简洁。 4. **...
3. Column:属性与表字段的映射,通过@Column注解定义字段名、长度、是否可为空等属性。 4. 关联映射:Hibernate支持一对一、一对多、多对一、多对多四种关联映射,如@OneToOne、@OneToMany、@ManyToOne、@...
下面将详细介绍与标题、描述及部分代码相关的几个核心知识点: ### Hibernate 连表查询基础 Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发人员将Java对象模型映射到数据库表,并在对象和数据库之间...
3. **实体类与映射文件**:每个数据库表通常对应一个Java实体类,实体类的属性与表的字段相对应。映射文件(如`.hbm.xml`)定义了实体类与数据库表之间的映射规则,包括字段类型、主键、外键、索引等信息。 4. **...