Ich hatte dasselbe Problem auf HQL-Abfrage. Ich löste das Problem, indem ich den Transformator änderte.
Das Problem führte dazu, dass der geschriebene Code als Map transformiert wurde. Aber es ist nicht für Alias Bean geeignet. Sie können den Fehlercode unten sehen. Der Code, der in die Umwandlung geschrieben wird, wird als Karte ausgegeben und ein neues Feld in die Karte eingefügt.
Klasse: org.hibernate.property.access.internal.PropertyAccessMapImpl.SetterImpl m Methode: set
@Override
@SuppressWarnings("unchecked")
public void set(Object target, Object value, SessionFactoryImplementor factory) {
((Map) target).put(propertyName, value);
}
Ich löste das Problem, den Transformator zu duplizieren und den Code zu ändern.
Sie können den Code im Projekt sehen.
-Link: https://github.com/robeio/robe/blob/DW1.0-migration/robe-hibernate/src/main/java/io/robe/hibernate/criteria/impl/hql/AliasToBeanResultTransformer.java
Klasse:
import java.lang.reflect.Field;
import java.util.Map;
import io.robe.hibernate.criteria.api.query.SearchQuery;
import org.hibernate.HibernateException;
import org.hibernate.transform.AliasedTupleSubsetResultTransformer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AliasToBeanResultTransformer extends AliasedTupleSubsetResultTransformer {
private static final Logger LOGGER = LoggerFactory.getLogger(AliasToBeanResultTransformer.class);
private final Class resultClass;
// Holds fields of Transform Class as Map. Key is name of field.
private Map<String, Field> fieldMap;
public AliasToBeanResultTransformer(Class resultClass) {
if (resultClass == null) {
throw new IllegalArgumentException("resultClass cannot be null");
}
fieldMap = SearchQuery.CacheFields.getCachedFields(resultClass);
this.resultClass = resultClass;
}
@Override
public boolean isTransformedValueATupleElement(String[] aliases, int tupleLength) {
return false;
}
@Override
public Object transformTuple(Object[] tuple, String[] aliases) {
Object result;
try {
result = resultClass.newInstance();
for (int i = 0; i < aliases.length; i++) {
String name = aliases[i];
Field field = fieldMap.get(name);
if(field == null) {
LOGGER.error(name + " field not found in " + resultClass.getName() + " class ! ");
continue;
}
field.set(result, tuple[i]);
}
}
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;
}
}
Nach neuen Transformer erstellt Sie wie unten verwenden können.
query.setResultTransformer(new AliasToBeanResultTransformer(YOUR_DTO.class));
warum sql Abfrage verwenden? Wann können Sie hql oder Kriterien verwenden? Sie setzen 'hql' anstelle von' sql' in 3 ein Fehler: P – nachokk
haha! Ich zeige nur ein Beispiel.In der Tat, einige Geschäfte müssen von SQL implementiert werden. – YETI