Hibernate не поддерживает доступ к полям на USERTYPES для критериев проекции?

StackOverflow https://stackoverflow.com/questions/4630445

Вопрос

Мои занятия:

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, но это «родной» для гибернации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top