Enums (playframework 2.0.2-java)EBean-使用枚举值查询时没有ScalarType注册错误

Enums (playframework 2.0.2-java)EBean-使用枚举值查询时没有ScalarType注册错误,enums,playframework,playframework-2.0,ebean,Enums,Playframework,Playframework 2.0,Ebean,我有角色实体类: @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 } 在一些测

我有角色实体类:

@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));
我收到错误消息:

[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)

有人知道什么可能是问题吗?

最快的解决方案,假设您映射的EnumValue与enum名称完全相同:

public enum RoleNameEnum {
    @EnumValue("REGULAR")
    REGULAR,
    @EnumValue("ADMIN")
    ADMIN
}
然后,您可以实现findByRole方法,如下所示:

public static List<User> findByRole(Role role) {
    return find.where().eq("role", role).findList();
}
public static List<User> findByRole(Role role) {
    return find.where().eq("role", role.name()).findList();
}
公共静态列表findByRole(角色){
返回find.where().eq(“role”,role.name()).findList();
}
其中,魔术只是使用映射字符串值而不是枚举实例作为角色名

我在ebean问题跟踪器上发布了一个bug:,binder应该检测enum对象并自动将其解释为映射值

编辑:

如果您需要简单枚举值以外的其他映射,这里是使用@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;
}
公共静态字符串序列化(T thenum){
试一试{
对于(字段f:theEnum.getDeclaringClass().getDeclaredFields()){
如果(theEnum.等于(f.get(theEnum))){
EnumValue EnumValue=f.getAnnotation(EnumValue.class);
如果(枚举值!=null)
返回enumValue.value();
}
}
}捕获(例外e){
}
返回null;
}
然后可以使用serialize方法实现findByRole

public static List<User> findByRole(Role role) {
    return find.where().eq("role", serialize(role)).findList();
}
公共静态列表findByRole(角色){
返回find.where().eq(“角色”,序列化(角色)).findList();
}

最快的解决方案,假设您映射的EnumValue与enum名称完全相同:

public enum RoleNameEnum {
    @EnumValue("REGULAR")
    REGULAR,
    @EnumValue("ADMIN")
    ADMIN
}
然后,您可以实现findByRole方法,如下所示:

public static List<User> findByRole(Role role) {
    return find.where().eq("role", role).findList();
}
public static List<User> findByRole(Role role) {
    return find.where().eq("role", role.name()).findList();
}
公共静态列表findByRole(角色){
返回find.where().eq(“role”,role.name()).findList();
}
其中,魔术只是使用映射字符串值而不是枚举实例作为角色名

我在ebean问题跟踪器上发布了一个bug:,binder应该检测enum对象并自动将其解释为映射值

编辑:

如果您需要简单枚举值以外的其他映射,这里是使用@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;
}
公共静态字符串序列化(T thenum){
试一试{
对于(字段f:theEnum.getDeclaringClass().getDeclaredFields()){
如果(theEnum.等于(f.get(theEnum))){
EnumValue EnumValue=f.getAnnotation(EnumValue.class);
如果(枚举值!=null)
返回enumValue.value();
}
}
}捕获(例外e){
}
返回null;
}
然后可以使用serialize方法实现findByRole

public static List<User> findByRole(Role role) {
    return find.where().eq("role", serialize(role)).findList();
}
公共静态列表findByRole(角色){
返回find.where().eq(“角色”,序列化(角色)).findList();
}

问题似乎在于您的用户上有一个角色列表,而不是一个属性

@Constraints.Required
@ManyToMany
public List<Role> roles = new ArrayList<Role>();
@Constraints.Required
@许多
public List roles=new ArrayList();
要查询该列表,请尝试:

public static List<User> findByRole(Role role) {
    return find.where().in("roles", role).findList();
}
公共静态列表findByRole(角色){
返回find.where().in(“roles”,role).findList();
}

问题似乎在于您的用户上有一个角色列表,而不是一个属性

@Constraints.Required
@ManyToMany
public List<Role> roles = new ArrayList<Role>();
@Constraints.Required
@许多
public List roles=new ArrayList();
要查询该列表,请尝试:

public static List<User> findByRole(Role role) {
    return find.where().in("roles", role).findList();
}
公共静态列表findByRole(角色){
返回find.where().in(“roles”,role).findList();
}

我怀疑查询条件中有问题:
find.where().eq(“角色”,role)
Cześć,向我们展示用户模型(编辑:向我们展示所有模型,可能在github上?)@biesior:User model:我怀疑查询条件中有问题:
find.where().eq(“角色”,role)
Cze>Cześ,向我们展示用户模型(编辑:向我们展示所有模型,可能在github上?@biesior:用户模型: