`
IsItLikeThat
  • 浏览: 41417 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

createSQLQuery 字段与属性绑定

 
阅读更多
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);
	}

}

 

分享到:
评论

相关推荐

    hibernate 的createSQLQuery的几种用法

    这个查询加载了关联的 kitten 实体,并将其与 cat 实体关联起来。 四、返回标量值 使用 createSQLQuery 方法可以返回一个简单的标量值,例如: ```java Double max = (Double) sess.createSQLQuery("select max...

    关于hibernate 的createQuery和createSqlQuery 的区别

    与 createQuery 方法不同的是,createSqlQuery 方法可以执行查询、修改和添加操作。 使用 createSqlQuery 方法可以执行以下操作: 1. 查询操作:使用 createSqlQuery 方法可以执行查询操作,例如: String sql = ...

    hibernate3中通过nativesql或取部分字段并映射为具体对象的实现

    例如,如果我们有一个User类,它有id和name属性,可以这样做: ```java List&lt;User&gt; users = sqlQuery.addEntity(User.class).list(); ``` 这样,查询结果将被自动封装成User对象的列表。然而,如果只想映射查询...

    Hibernate的char问题.txt

    - **问题**: 在使用 HQL 或者 Native SQL 查询时,如果绑定的参数类型与数据库字段的类型不符,也会导致异常。 - **原因**: 如果查询条件中的参数类型与数据库字段的类型不匹配,Hibernate 将无法正确地执行类型转换...

    Hibernate_NSQL&HQL增删改操作

    1. **语法风格**:HQL更加面向对象,语法结构与Java类及其属性紧密相关;而NSQL则遵循标准SQL语法。 2. **类型安全**:HQL支持类型安全的参数绑定,而NSQL则需要显式指定参数类型。 3. **可移植性**:HQL由于其面向...

    Query对象setResultTransFormer()

    在上面的代码中,我们使用 setResultTransformer() 方法将查询结果转换为 Map 对象,每个 Map 对象的 KEY 是数据库中的字段名,VALUE 是该字段的值。 Transformers.ALIAS_TO_ENTITY_MAP 是 Hibernate 中的一个转换...

    ssh2框架下多表查询的单个模块开发

    例如,在给定的部分内容中提到的私有整型字段,可以理解为某个实体类的一个属性。 **示例代码:** ```java public class 范类 { private Integer 字段; // Getter 和 Setter 方法 public Integer get字段() { ...

    Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法

    Hibernate是Java平台下的一款优秀对象关系映射(ORM)框架,它极大地简化了Java应用程序与数据库之间的交互过程。然而,在使用Hibernate执行SQL查询时,如果查询的目标表中存在char类型的字段,Hibernate有时会将该...

    Hibernate+本地SQL查询SQLQuery.pdf

    原生SQL查询可能返回单一标量值或混合标量值与实体的结果。例如,查询猫的最大体重: ```java Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat") .addScalar(...

    在Java的Hibernate框架中使用SQL语句的简单介绍

    在这里,`id`、`name`和`age`被分别映射到`TUser`类的相应属性。 此外,为了遵循某些团队的编码规范,避免在代码中直接写SQL语句,你可以在Hibernate的配置文件中定义SQL查询。例如: ```xml select {usr.*} ...

    如何解决hibernate自动更新实体类的问题共5页.pdf.zip

    6. **使用`@DynamicUpdate`**:在实体类上使用`@DynamicUpdate`注解,Hibernate会根据实际变更的字段生成更新语句,而非全字段更新,但请注意这可能增加数据库查询复杂度。 四、最佳实践 在实际开发中,应结合业务...

    Native SQL查询 (使用SQLQuery).doc

    在 Hibernate 中,使用 SQLQuery 可以执行 Native SQL 查询,控制查询的执行是通过 SQLQuery 接口进行的,通过执行 Session.createSQLQuery() 获取这个接口。下面将详细介绍如何使用这个 API 进行查询。 标量查询...

    hibernate criteria的使用方法

    这里通过 `Example.create()` 方法创建了一个基于对象样例的查询,可以查询与样例对象具有相同属性值的对象。 2. **通过 Restrictions 创建查询**: ```java Criteria cri = session.createCriteria...

    hibernate入门--第一个实例

    每个实体类都有一个对应的映射文件,其中定义了属性与数据库字段的映射关系。 - **注解映射**: 现代Hibernate更倾向于使用注解进行映射,这样可以将元数据直接嵌入到实体类中,使得代码更加简洁。 4. **...

    Hibernate备课笔记.pdf

    3. Column:属性与表字段的映射,通过@Column注解定义字段名、长度、是否可为空等属性。 4. 关联映射:Hibernate支持一对一、一对多、多对一、多对多四种关联映射,如@OneToOne、@OneToMany、@ManyToOne、@...

    Hibernate连表查询 Hibernate连表查询

    下面将详细介绍与标题、描述及部分代码相关的几个核心知识点: ### Hibernate 连表查询基础 Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发人员将Java对象模型映射到数据库表,并在对象和数据库之间...

    Hibernate3.1中文帮助文档

    3. **实体类与映射文件**:每个数据库表通常对应一个Java实体类,实体类的属性与表的字段相对应。映射文件(如`.hbm.xml`)定义了实体类与数据库表之间的映射规则,包括字段类型、主键、外键、索引等信息。 4. **...

Global site tag (gtag.js) - Google Analytics