2012-08-14 26 views
1

我有作用的實體類:(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()EQ( 「角色」,角色)' – TOUDIdel 2012-08-14 20:40:15

+0

Cześć,向我們展示用戶模型(編輯:向我們展示所有模型,或許在github上?) – biesior 2012-08-14 20:45:41

+0

@biesior:用戶模型:http://pastebin.com/rLmMMAEr – TOUDIdel 2012-09-05 12:27:36

回答

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(); 
} 

在魔術只是使用映射的字符串值而不是角色名稱的枚舉實例。

我在ebean問題跟蹤器上發佈了一個bug:http://www.avaje.org/bugdetail-427.html,活頁夾應該檢測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; 
} 

然後你就可以得到一套價值使用序列化方法實現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(); 
}