0

我正在寻找的似乎在这里得到了回答,但我不确定重复这一点,因为我对 JPA 不太熟悉。

我的情况涉及 3 个类 :和Role,描述如下:UserPool

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方法中使用),但我不确定如何获取所有具有相交组的用户(可能还有其他约束)。

感谢您的帮助。

4

1 回答 1

1

首先,我会将您的查找器移动到 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。

于 2013-08-16T18:59:37.687 回答