2012-08-14 3 views
1

У меня Role класса сущностей:(playframework 2.0.2-Java) EBean - Нет ScalarType зарегистрирована ошибка при запросе с перечислением значений

@Entity 
public class Role extends Model { 

    @Id 
    @Constraints.Required 
    public Integer id; 

    @Constraints.Required 
    @Formats.NonEmpty 
    @Enumerated(EnumType.STRING) 
    public RoleNameEnum name; // name is enum value 
} 

В некоторых тест я пытаюсь найти пользователей по ролям:

List<User> users = User.findByRole(Role.findByRoleName(RoleNameEnum.ADMIN)); 

где метод findByRoleName() следующий:

public static List<User> findByRole(Role role) { 
    return find.where().eq("role", role).findList(); 
} 

Я получаю сообщение об ошибке:

[error] Test UserTest.findUsersByRole failed: No ScalarType registered for class models.Role 
[error]  at com.avaje.ebeaninternal.server.persist.Binder.bindObject(Binder.java:183) 
[error]  at com.avaje.ebeaninternal.server.query.CQueryPredicates.bind(CQueryPredicates.java:162) 
[error]  at com.avaje.ebeaninternal.server.query.CQuery.prepareBindExecuteQuery(CQuery.java:413) 
[error]  at com.avaje.ebeaninternal.server.query.CQueryEngine.findMany(CQueryEngine.java:198) 
[error]  at com.avaje.ebeaninternal.server.query.DefaultOrmQueryEngine.findMany(DefaultOrmQueryEngine.java:104) 
[error]  at com.avaje.ebeaninternal.server.core.OrmQueryRequest.findList(OrmQueryRequest.java:344) 
[error]  at com.avaje.ebeaninternal.server.core.DefaultServer.findList(DefaultServer.java:1469) 
[error]  at com.avaje.ebeaninternal.server.querydefn.DefaultOrmQuery.findList(DefaultOrmQuery.java:906) 
[error]  at com.avaje.ebeaninternal.util.DefaultExpressionList.findList(DefaultExpressionList.java:201) 
[error]  at models.User.findByRole(User.java:63) 
[error]  at UserTest$4.run(UserTest.java:62) 
[error]  at play.test.Helpers.running(Helpers.java:294) 
[error]  at UserTest.findUsersByRole(UserTest.java:58) 

Есть ли у кого-нибудь идеи, что может быть проблемой?

+0

Я подозреваю, что проблема в состоянии запроса:. 'Find.where() экв ("роль", роль)' – TOUDIdel

+0

Część, показать нам Модель пользователя (изменить: показать нам все модели, возможно, на github?) – biesior

+0

@biesior: Пользовательская модель: http://pastebin.com/rLmMMAEr – TOUDIdel

ответ

4

Кратчайший решение, при условии, что вы отображения EnumValue точно так же, как имена перечислений:

public enum RoleNameEnum { 
    @EnumValue("REGULAR") 
    REGULAR, 
    @EnumValue("ADMIN") 
    ADMIN 
} 

Затем вы можете реализовать метод findByRole следующим образом:

public static List<User> findByRole(Role role) { 
    return find.where().eq("role", role.name()).findList(); 
} 

, где магия просто используя отображаемое строковое значение вместо экземпляра enum для имени роли.

Я отправил ошибку на трекер проблемы с ebean: http://www.avaje.org/bugdetail-427.html, связующее должно обнаружить объект перечисления и интерпретировать его как отображаемое значение автоматически.

EDIT:

В случае, если вам нужны другие отображения, чем простое значение перечисления, здесь это утилита код, чтобы получить набор значений с помощью @EnumValue аннотацию

public static <T extends Enum<T>> String serialize(T theEnum) { 
    try { 
     for (Field f : theEnum.getDeclaringClass().getDeclaredFields()) { 
      if (theEnum.equals(f.get(theEnum))) { 
       EnumValue enumValue = f.getAnnotation(EnumValue.class); 
       if (enumValue != null) 
        return enumValue.value(); 
      } 
     } 
    } catch (Exception e) { 
    } 
    return null; 
} 

Тогда вы можете реализовать findByRole с использованием методы сериализации

public static List<User> findByRole(Role role) { 
    return find.where().eq("role", serialize(role)).findList(); 
} 
2

Выглядит как вопрос в том, что у вас есть список ролей, а не одно свойства на ваш пользователе.

@Constraints.Required 
@ManyToMany 
public List<Role> roles = new ArrayList<Role>(); 

Для запроса к этому списку, попробуйте:

public static List<User> findByRole(Role role) { 
    return find.where().in("roles", role).findList(); 
}