我正在尝试确定在Play中使用JPA时查询OneToMany关系的子项时页面/限制返回的行的最佳方法!框架。
@Entity
public class User extends Model {
@OneToMany(mappedBy="user", cascade=CascadeType.ALL)
public List<CaseFolder> caseFolders;
}
public class CaseFolder extends Model {
@Required
@ManyToOne
public User user;
@Required
public String number;
public String description;
}
我意识到我可以将这种关系设置为懒惰的提取。但是,当我最终访问user.caseFolders时,这似乎仍然无法阻止我检索整个CaseFolders列表。
理想情况下,我希望能够做到这样的事情:
user.getCaseFolders().start(100).limit(10)
但我找不到任何关于“开箱即用”的事情。
每当他们需要一些1米关系的“孩子”时,每个人是否真的将整个相关数据集带入内存?
我正在实现一个具有分页功能的UI(使用jqgrid),用户可能拥有数千条记录。
答案 0 :(得分:0)
经过进一步研究,这是我提出的答案:
关系的“许多”方面 - 所有caseFolders的集合 - 是用户的属性。根据定义,该属性的值是整个集合。
要获取这些元素的子集,我将以下方法添加到我的用户模型中:
public List<CaseFolder> getCaseFolders(String sidx, String sord, int start, int limit) {
String orderBy = "c." + sidx + " " + ((sord.toUpperCase().equals("ASC")) ? "ASC" : "DESC");
String jpql = "SELECT c " +
"FROM CaseFolder c " +
"WHERE c.user = :user " +
"ORDER BY " + orderBy;
Query query = JPA.em().createQuery(jpql)
.setParameter("user", this)
.setFirstResult(start)
.setMaxResults(limit);
List<CaseFolder> result = query.getResultList();
return result;
}