Hibernate ne supporte pas l'accès aux champs sur usertypes pour critères de projection?
-
08-10-2019 - |
Question
Mes classes:
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");
}
J'ai aussi un AccountTypeUserType de configuration correctement.
Ma Recherche:
List results = session.createCriteria(User.class)
.setProjection(Projections.projectionList()
.add(Projections.property("accountType.name"), "accountType)
)
.setResultTransformer(Transformer.aliasToBean(UserSummary.class))
.list()
Le problème que je cours en est que ma requête échoue avec ...
org.hibernate.QueryException: could not resolve property: accountType.name of: com.huskyenergy.routecommander.domain.rtc.User
Oh, et vous ne pouvez pas .createAlias ??( "accountType", "à") soit parce que accountType n'est pas une association.
Toutes les pensées?
La solution
Comme vous avez probablement réalisé, un UserType est pas une entité. La meilleure façon de voir pourquoi vous ne pouvez pas accéder à une propriété dans un UserType est d'utiliser URL
comme exemple. Vous ne ferez pas une requête demandant URL.host, mais pour lui-même URL. Voilà pourquoi un UserType devrait savoir comment transformer une chaîne en un objet et un objet dans une chaîne, par exemple. , Vous aurez ainsi utiliser quelque chose comme ceci:
.add(Projections.property("accountType.name"), AccountType.User)
Regardez cet exemple UserType et le test pour elle de la suite de tests.
Mais je pense que la question est de savoir pourquoi vous n'utilisez pas Enum (et @Enumerated), au lieu de ce UserType. Je pense qu'un Enum est un meilleur ajustement, car il est à l'intérieur d'un UserType, mais il « natif » de la mise en veille prolongée.