package com.pccw.business.fcm.common.hibernate;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
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; /**
* 自定义的数据库字库转换成POJO
*/
public class ExtColumnToBean implements ResultTransformer {
private static final long serialVersionUID = 1L;
private final Class resultClass;
private Setter[] setters;
private PropertyAccessor propertyAccessor;
private List<Field> fields = new ArrayList<Field>();
BigDecimal bigDecimal = null; public ExtColumnToBean(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") });
} // 结果转换时,HIBERNATE调用此方法
public Object transformTuple(Object[] tuple, String[] aliases) {
Object result; try {
if (setters == null) {// 取得目标POJO类的所有SETTER方法
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(); // 这里使用SETTER方法填充POJO对象
for (int i = 0; i < aliases.length; i++) {
if (setters[i] != null) {
Class[] parameterTypes = setters[i].getMethod().getParameterTypes();
if(parameterTypes == null || parameterTypes.length == 0){
continue;
}
//pojo set方法默认只有一个参数
if(parameterTypes[0].equals(Integer.class)){
if(tuple[i] instanceof BigDecimal){
bigDecimal = (BigDecimal)tuple[i];
setters[i].set(result, bigDecimal.intValue(), null);
}
}else if(parameterTypes[0].equals(Long.class)){
if(tuple[i] instanceof BigDecimal){
bigDecimal = (BigDecimal)tuple[i];
setters[i].set(result, bigDecimal.longValue(), null);
}
}else if(parameterTypes[0].equals(Double.class)){
if(tuple[i] instanceof BigDecimal){
bigDecimal = (BigDecimal)tuple[i];
setters[i].set(result, bigDecimal.doubleValue(), null);
}
}else{
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;
} /**
* 根据数据库字段名在POJO查找JAVA属性名 如:USER_ID 如果没有对应的属性名返回null
*
* @param alias
* 数据库字段名
* @return
*/
private Setter getSetterByColumnName(String alias) {
// 取得POJO所有属性名
// Field[] fields = resultClass.getDeclaredFields();
if (fields.isEmpty()) {
this.getClassField(resultClass);
}
if (fields == null || fields.size() == 0) {
throw new RuntimeException("实体" + resultClass.getName() + "不含任何属性");
}
// 把字段名中所有的下杠去除
String proName = alias.replaceAll("_", "").toLowerCase();
for (int i = 0; i < fields.size(); i++) {
Field field = fields.get(i);
//System.out.println(field.getName().toLowerCase());
if (field.getName().toLowerCase().equals(proName)) {// 去除下杠的字段名如果和属性名对得上,就取这个SETTER方法
return propertyAccessor.getSetter(resultClass, field.getName());
}
}
return null;
} @SuppressWarnings("unchecked")
public List transformList(List collection) {
return collection;
} private void getClassField(Class c) {
Field[] fs = c.getDeclaredFields();
if (fs != null && fs.length > 0) {
List li = Arrays.asList(fs);
fields.addAll(li);
}
Class superclass = c.getSuperclass();
if (superclass != null) {// 简单的递归一下
getClassField(superclass);
}
} }

hibernate 数据库列别名自动映射pojo属性名的更多相关文章

  1. SpringBoot注解把配置文件自动映射到属性和实体类实战

    SpringBoot注解把配置文件自动映射到属性和实体类实战 简介:讲解使用@value注解配置文件自动映射到属性和实体类 1.配置文件加载 方式一 1.Controller上面配置 @Propert ...

  2. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-7.接口配置文件自动映射到属性和实体类配置

    笔记 7.接口配置文件自动映射到属性和实体类配置     简介:使用@value注解配置文件自动映射到属性和实体类 1.添加 @Component或者Configuration 注解:        ...

  3. SpringBoot------注解把配置文件自动映射到属性和实体类

    1.映射到属性 package top.ytheng.demo.controller; import org.springframework.beans.factory.annotation.Valu ...

  4. SpringBoot配置文件自动映射到属性和实体类(8)

    一.配置文件加载 1.Controller中配置并指向文件 @Controller @PropertySource(value = { "application.properties&quo ...

  5. 002.Oracle数据库 , 列别名

    /*Oracle数据库查询日期在两者之间*/ SELECT OCCUR_DATE as "我是一列" FROM LM_FAULT WHERE ( ( OCCUR_DATE > ...

  6. MyBatis 中使用数据库查询别名进行映射

    方法1 XXMapper.xml <mapper namespace="com.hfepc.dao.andon.AndonExceptionKanbanVOMapper" & ...

  7. Hibernate (开源对象关系映射框架)

    一.基本介绍1.它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm(对象关系映射)框架,hibernate可以自动生成SQL语句,自动执行: Hibern ...

  8. Mybatis映射文件的自动映射与手动映射问题

    Mapper XML 文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会 ...

  9. MyBatis(5)——解决属性名与列名不一致的问题

    解决属性名与列名不一致的问题 问题描述: 当实体类的属性与数据库的列名不对应时取不到该列数据 说明:MyBatis会根据查询的列名设值(列名的setter方法),然后以此列名为做查询等操作,在此过程中 ...

随机推荐

  1. C++学习网站(转)

    想要学习C++,这里有一些很好资源. http://www.open-std.org/JTC1/SC22/WG21/ 这是C++标准的官网,这里是最全最新的,没有再比这个网站里的东西更有权威. htt ...

  2. visible,invisible,gone区别

    在Android开发中,大部分控件都有visibility这个属性,其属性有3个分别为“visible ”.“invisible”.“gone”.主要用来设置控制控件的显示和隐藏.有些人可能会疑惑In ...

  3. lr参数化——500户并发迭代1次 循环取5条数据

    lr参数化——500户并发迭代1次 循环取5条数据 比如vuser1.vuser2.vuser3..........,vuser500 shuju1,shuju2,shuju3,shuju4,shuj ...

  4. 向数据库中添加内容 manageStdInfo.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="manageStdInfo.as ...

  5. Spring计划

    团队: 郭志豪:http://www.cnblogs.com/gzh13692021053/ 杨子健:http://www.cnblogs.com/yzj666/ 刘森松:http://www.cnb ...

  6. PrintDocument 实践

    简单使用,直接上代码 1.设置打印页大小 和页边距 this.printDocument1.DefaultPageSettings = new System.Drawing.Printing.Page ...

  7. 【BZOJ】1082: [SCOI2005]栅栏(二分+dfs)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1082 题意:n个给出木板,m个给出木板.可以将那m个木板锯成泥想要的长度.问最大能锯成多少个给出的n ...

  8. linux tar 备份命令

    转载:http://www.douban.com/note/57861194/ tar [-cxtzjvfpPN] 文件与目录 ….参数:-c :建立一个压缩文件的参数指令(create 的意思):- ...

  9. 【BZOJ】1067: [SCOI2007]降雨量(rmq+变态题)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1067 好不爽,弄了一个晚上. 好不爽. 还是照着别人程序拍着看的!!! 噗 这题很变态. 首先,我没 ...

  10. 【BZOJ】1084: [SCOI2005]最大子矩阵(DP)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1084 有一个1A--- 本题没看懂,,不会啊囧..感觉完全设不了状态..看了题解,囧,m<=2 ...