select firstName, lastName from Employee
query.setResultTransformer(Transformers.aliasToBean(MyResults.class));
Nie możesz użyj powyższego kodu z Hibernate 5 i Hibernate 4 (przynajmniej Hibernate 4.3.6.Final), z powodu wyjątku
java.lang.ClassCastException: com.github.fluent.hibernate.request.persistent.UserDto cannot be cast to java.util.Map
at org.hibernate.property.access.internal.PropertyAccessMapImpl$SetterImpl.set(PropertyAccessMapImpl.java:102)
Problemem jest to, że przetwarza hibernacji aliasy nazwami kolumn wersalikami - firstName
się FIRSTNAME
. I spróbować znaleźć getter z nazwą getFIRSTNAME()
i seter setFIRSTNAME()
w DTO
stosując takie strategie
PropertyAccessStrategyChainedImpl propertyAccessStrategy = new PropertyAccessStrategyChainedImpl(
PropertyAccessStrategyBasicImpl.INSTANCE,
PropertyAccessStrategyFieldImpl.INSTANCE,
PropertyAccessStrategyMapImpl.INSTANCE
);
Tylko PropertyAccessStrategyMapImpl.INSTANCE
garnitury, w opinii Hibernate, dobrze. Więc po tym próbuje przeprowadzić konwersję (Map)MyResults
.
public void set(Object target, Object value, SessionFactoryImplementor factory) {
((Map) target).put(propertyName, value);
}
Nie wiem, jest to błąd lub funkcja.
Jak rozwiązać
Korzystanie aliasy cytatami
public class Results {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
String sql = "select firstName as \"firstName\",
lastName as \"lastName\" from Employee";
List<Results> employees = session.createSQLQuery(sql).setResultTransformer(
Transformers.aliasToBean(Results.class)).list();
pomocą transformatora zwyczaj wynik
Innym sposobem rozwiązania problemu - przy użyciu transformatora wynik, który ignoruje nazwa przypadku metody (traktuj jako getFirstName()
jako getFIRSTNAME()
). Możesz napisać własną lub użyć FluentHibernateResultTransformer. Nie musisz używać cudzysłowów i cudzysłowów (jeśli masz nazwy kolumn równe nazwom DTO).
Wystarczy pobrać bibliotekę ze strony projektu (nie potrzeba dodatkowych słoików): fluent-hibernate.
String sql = "select firstName, lastName from Employee";
List<Results> employees = session.createSQLQuery(sql)
.setResultTransformer(new FluentHibernateResultTransformer(Results.class))
.list();
Ten transformator może być stosowany do zagnieżdżonych projekcji TOO: How to transform a flat result set using Hibernate
śmieszne, mogę odtworzyć problem z Hibernate 5.1. Transformator 'Transformers.aliasToBean (CatDTO.class)' nie działa. Właśnie testowałem z własnym transformatorem przed :) Spróbuj dowiedzieć się, dlaczego tak jest. –
To jest o wiele zabawniejsze, miałem rację z aliasami. Zobacz moją odpowiedź: http://stackoverflow.com/a/37423885/3405171 –