Hibernate не поддерживает доступ к полям на USERTYPES для критериев проекции?
-
08-10-2019 - |
Вопрос
Мои занятия:
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");
}
У меня также есть правильно настроен AccountTyPeusertype.
Мой запрос:
List results = session.createCriteria(User.class)
.setProjection(Projections.projectionList()
.add(Projections.property("accountType.name"), "accountType)
)
.setResultTransformer(Transformer.aliasToBean(UserSummary.class))
.list()
Проблема, в которой я столкнулся, это то, что мой запрос терпит неудачу с ...
org.hibernate.QueryException: could not resolve property: accountType.name of: com.huskyenergy.routecommander.domain.rtc.User
Ох, и вы не можете. Createalias («AccountTyPe», «AT») либо потому, что AccountType не является ассоциацией.
Есть предположения?
Решение
Как вы, вероятно, поняли, у USERTYPE не является объектом. Лучший способ понять, почему вы не можете получить доступ к недвижимости в USERTYPE - это использовать URL
как пример. Вы не сделаете запрос, просящий URL.Host, но для самого URL. Вот почему USERTYPE должен знать, как преобразовать строку в объект, а также объект в строку. Итак, вам придется использовать что-то вроде этого:
.add(Projections.property("accountType.name"), AccountType.User)
смотреть на этот пример USERTYPE а также Тестовый случай для него из тестового набора.
Но я думаю, что реальный вопрос заключается в том, почему вы не используете Enum (и @enumerated) вместо этого USERTYPE. Я думаю, что Enum - лучшая подходящая, так как он внутренне является USERTYPE, но это «родной» для гибернации.