0

我正在尝试确定在 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)

但我找不到任何关于“开箱即用”的做法。

每个人真的每次需要几个一米关系的“孩子”时都会把整个相关数据集都带入内存吗?

我正在实现一个具有分页功能的 UI(使用 jqgrid),并且用户可能拥有数千条记录。

4

1 回答 1

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;

}
于 2013-01-31T00:09:15.713 回答