播放框架2:在Finder中的模型之间加入

时间:2013-08-14 02:18:26

标签: playframework-2.1 ebean

我正在寻找的内容似乎得到了回答here,但由于我对JPA不太熟悉,我不能再重复一遍。

我的情况涉及3个班级:RoleUserPool,描述如下:

public class Role extends Model {
   @Id public Long id;
   public String name;
   // ...
}

public class User extends Model {
   @Id public Long id;
   public string displayName;
   // ...
   @ManyToMany
   public List<Role> roles;
   // ...
}

public class Pool extends Model {
   @Id public Long id;
   public String name;
   // ...
   @ManyToMany
   public List<Role> roles;

   public List<User> getMembers() {
      // ???
   }
}

注意:可能还有可分配给用户和池的资源限制或权限,可用于过滤..或out ..池中允许的用户。)

我添加了static成员

public static final Finder<Long, User> find = new Finder<Long, User>(Long.class, User.class);

Pool类(应该在getPoolMembers方法中使用),但我不确定如何获取具有相交组的所有用户(以及可能的其他约束)。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

首先,我将你的finder移动到User类,这样User.find返回User对象,而不是返回用户的Pool.find。

如果没有用户和池之间的直接链接来进行Ebean提取,我建议使用SqlQuery(我在你的OP评论中混淆了SqlQuery和RawSql:Sql Query允许更容易地参数化查询; RawSql适用于查询修复时)

SqlQuery的结果是SqlRows的集合。鉴于这些,您可以映射回用户。

代码看起来像:

List<User> = new ArrayList<User>();

SqlQuery query = Ebean.createSqlQuery("select user.id from User left join Pool on (User.role=Pool.role) where (Pool.id=:id)"); // parameter is prefixed by a colon
query.setParameter("id", this.id);

List<SqlRow> rows = query.findList();
for(SqlRow row : rows){
    users.add(User.find.byId(row.getLong("user.id")); // gets the entry from the row for user.id, finds the User corresponding to the id, and then adds the User to the results list
}

它不优雅,但HTH。