Hibernate не поддерживает доступ к полям в пользовательских типах для критериев проекции? - PullRequest
3 голосов
/ 08 января 2011

Мои занятия:

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 не является ассоциацией.

Есть мысли?

1 Ответ

2 голосов
/ 08 января 2011

Как вы, вероятно, поняли, UserType не является сущностью.Лучший способ понять, почему вы не можете получить доступ к свойству в типе пользователя, - это использовать URL в качестве примера.Вы не будете делать запрос с URL.host, а с самим URL.Вот почему UserType должен знать, как преобразовать строку в объект, а объект в строку, например.Итак, вам придется использовать что-то вроде этого:

.add(Projections.property("accountType.name"), AccountType.User)

Посмотрите на этот пример UserType и тестовый пример для него из набора тестов.

Но я думаю, что реальный вопрос заключается в том, почему вы не используете Enum (и @Enumerated) вместо этого UserType.Я думаю, что Enum лучше подходит, так как он внутренне UserType, но он «родной» для Hibernate.

...