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);
}
}