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); } } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。