1

ロールエンティティクラスがあります:

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

誰かが何が問題になるのか考えていますか?

4

2 に答える 2

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 Issue Trackerにバグを投稿しました:http ://www.avaje.org/bugdetail-427.html 、バインダーは列挙型オブジェクトを検出し、それをマップされた値として自動的に解釈する必要があります。

編集:

単純な列挙値以外のマッピングが必要な場合は、@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;
}

次に、serializeメソッドを使用してfindByRoleを実装できます

public static List<User> findByRole(Role role) {
    return find.where().eq("role", serialize(role)).findList();
}
于 2012-09-26T14:37:16.837 に答える
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();
}
于 2012-12-22T07:05:03.570 に答える