Hibernate non supporta l'accesso ai campi su usertypes per criteri di proiezione?
-
08-10-2019 - |
Domanda
I miei Corsi:
public class User
{
@Type(type="AccountType")
private AccountType accountType;
}
public class AccountType
{
private String name;
private AccountType(String name)
{
this.name = name;
}
public static AccountType User = new AccountType("User");
public static AccountType Administrator = new AccountType("Administrator");
}
Ho anche una corretta messa a punto AccountTypeUserType.
La mia domanda:
List results = session.createCriteria(User.class)
.setProjection(Projections.projectionList()
.add(Projections.property("accountType.name"), "accountType)
)
.setResultTransformer(Transformer.aliasToBean(UserSummary.class))
.list()
Il problema che ho incontrato è che la mia domanda non riesce con ...
org.hibernate.QueryException: could not resolve property: accountType.name of: com.huskyenergy.routecommander.domain.rtc.User
Oh e non è possibile .createAlias ??( "accountType", "a"), o perché accountType non è un'associazione.
Qualche idea?
Soluzione
Come probabilmente vi siete resi conto, un UserType non è un'entità. Il modo migliore per vedere il motivo per cui non è possibile accedere a una proprietà in un UserType è quello di utilizzare URL
come l'esempio. Non sarà fare una query per chiedere URL.host, ma per URL stesso. Ecco perché un UserType dovrebbe sapere come trasformare una stringa in un oggetto e un oggetto in stringa, per esempio. Quindi, dovrete usare qualcosa di simile a questo:
.add(Projections.property("accountType.name"), AccountType.User)
Guarda questo esempio UserType e il banco di prova per esso dalla suite di test.
Ma penso che la vera domanda è perché non si utilizza un Enum (e @Enumerated), al posto di questo UserType. Penso che un Enum è una misura migliore, in quanto si tratta di un interno UserType, ma è "nativo" per Hibernate.