hibernate 数据库列别名自动映射pojo属性名
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属性名的更多相关文章
- SpringBoot注解把配置文件自动映射到属性和实体类实战
SpringBoot注解把配置文件自动映射到属性和实体类实战 简介:讲解使用@value注解配置文件自动映射到属性和实体类 1.配置文件加载 方式一 1.Controller上面配置 @Propert ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-7.接口配置文件自动映射到属性和实体类配置
笔记 7.接口配置文件自动映射到属性和实体类配置 简介:使用@value注解配置文件自动映射到属性和实体类 1.添加 @Component或者Configuration 注解: ...
- SpringBoot------注解把配置文件自动映射到属性和实体类
1.映射到属性 package top.ytheng.demo.controller; import org.springframework.beans.factory.annotation.Valu ...
- SpringBoot配置文件自动映射到属性和实体类(8)
一.配置文件加载 1.Controller中配置并指向文件 @Controller @PropertySource(value = { "application.properties&quo ...
- 002.Oracle数据库 , 列别名
/*Oracle数据库查询日期在两者之间*/ SELECT OCCUR_DATE as "我是一列" FROM LM_FAULT WHERE ( ( OCCUR_DATE > ...
- MyBatis 中使用数据库查询别名进行映射
方法1 XXMapper.xml <mapper namespace="com.hfepc.dao.andon.AndonExceptionKanbanVOMapper" & ...
- Hibernate (开源对象关系映射框架)
一.基本介绍1.它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm(对象关系映射)框架,hibernate可以自动生成SQL语句,自动执行: Hibern ...
- Mybatis映射文件的自动映射与手动映射问题
Mapper XML 文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会 ...
- MyBatis(5)——解决属性名与列名不一致的问题
解决属性名与列名不一致的问题 问题描述: 当实体类的属性与数据库的列名不对应时取不到该列数据 说明:MyBatis会根据查询的列名设值(列名的setter方法),然后以此列名为做查询等操作,在此过程中 ...
随机推荐
- 安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(三)码农网
12. 安装 Apache Tomcat Tomcat 是由 Apache 设计的用来运行 Java HTTP web 服务器的 servlet 容器.按照下面的方法安装 tomcat,但需要指出的是 ...
- GC日志介绍
每一种收集器的日志形式都是由它们自身的实现所决定的,换而言之,每个收集器的日志格式都可以不一样.但虚拟机设计者为了方便用户阅读,将各个收集器的日志都维持一定的共性,例如以下两段典型的GC日志: 33. ...
- 递推DP 赛码 1005 Game
题目传送门 /* 递推DP:官方题解 令Fi,j代表剩下i个人时,若BrotherK的位置是1,那么位置为j的人是否可能获胜 转移的时候可以枚举当前轮指定的数是什么,那么就可以计算出当前位置j的人在剩 ...
- reqSUB错误
---- ERROR ---- Error in dispatcher subroutine reqSUB: Invalid PAR(1): 0502 上面是用adams/ca加载一个汽车模型时 ...
- C#线程间同步无法关闭
用C#做了个线程间同步的小程序,但每次关闭窗口后进程仍然在,是什么原因? 解决方法: 要加一句 线程.IsBackground = true; 否则退出的只是窗体 上面的方法没看懂... MSDN上说 ...
- javascript,HTML,PHP,ASP做301跳转代码 SEO优化设置
URL HTTP Redirection URL http redirection is an automatic URL change operation from one URL to anoth ...
- 微信公众平台开发:Web App开发入门
WebApp与Native App有何区别呢?Native App:1.开发成本非常大.一般使用的开发语言为JAVA.C++.Objective-C.2.更新体验较差.同时也比较麻烦.每一次发布新的版 ...
- 【BZOJ】3223: Tyvj 1729 文艺平衡树(splay)
http://www.lydsy.com/JudgeOnline/problem.php?id=3223 默默的.. #include <cstdio> #include <cstr ...
- 【NOIP2003】传染病控制(-贪心/dfs)
我自己yy了个贪心算法,在某oj 0msAC~.然后去wikioi提交,呵呵,原来是之前oj的数据太弱给我水过了,我晕. 我之前的想法是在这棵树上维护sum,然后按时间来割边,每一时刻割已经感染的人所 ...
- Java_BigDecimal类型比较大小
这个类是java里精确计算的类 1 比较对象是否相等 一般的对象用equals,但是BigDecimal比较特殊,举个例子: BigDecimal a=BigDecimal.valueOf(1.0); ...