在Play中限制onetomany关系的记录!骨架

时间:2013-01-29 04:03:55

标签: jpa playframework

我正在尝试确定在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),用户可能拥有数千条记录。

1 个答案:

答案 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;

}