【问题标题】:Play framework 2 : JOIN between models in Finder播放框架 2:Finder 中模型之间的 JOIN
【发布时间】:2013-08-14 02:18:26
【问题描述】:

我正在寻找的似乎是 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() {
      // ???
   }
}

(注意:也可能存在资源限制或权限,可以分配给用户和池,可用于过滤...或过滤...池中允许的用户.)

我添加了一个static 成员

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

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

感谢您的帮助。

【问题讨论】:

  • 用户是否有一个池字段来链接两者,或者他们是否通过角色以某种方式链接?
  • 是的,他们共享相同的角色,但本质上,我不希望 PoolUser 之间有任何直接关系; User 是池的一部分,如果它共享任何相同的 Role
  • 我不确定您是否可以配置 Ebean 来做到这一点。我认为你最好做一个 RawSql 查询,所以你可以自己配置连接。我假设您想要的查询类似于select * from User left join Pool on (User.role=Pool.role) where (Pool.id=$id) 其中$id 是您调用getPoolMembers 方法的池的ID,对吗?我面前没有 Ebean RawSql 的语法,但我会检查一个例子......

标签: playframework-2.1 ebean


【解决方案1】:

首先,我会将您的 finder 移至 User 类,这样 User.find 返回 User 对象,而不是 Pool.find 返回 Users。

如果用户和池之间没有直接链接来进行 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。

【讨论】:

  • 这是一个好的开始!是的,从Pool 返回Users 有点奇怪......谢谢你的评论。
  • 那么你现在的立场是什么?我实际上并没有创建一个项目来单独测试这段代码,但我在我的一个项目中将其放入了类似的关系,并得到了我预期的结果。是不是没有给你预期的结果?
猜你喜欢
  • 2012-08-14
  • 2013-05-10
  • 2012-07-22
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
相关资源
最近更新 更多