我正在寻找的内容似乎得到了回答here,但由于我对JPA不太熟悉,我不能再重复一遍。
我的情况涉及3个班级:Role
,User
和Pool
,描述如下:
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
方法中使用),但我不确定如何获取具有相交组的所有用户(以及可能的其他约束)。
感谢您的帮助。
答案 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。