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)

しかし、私はそれを「箱から出して」行うことについて何も見つけることができません。

1 mの関係の「子供」の数人が必要になるたびに、誰もが本当に関連するデータセット全体をメモリに持ち込むのでしょうか。

(jqgridを使用して)ページングを備えたUIを実装しており、ユーザーは数千のレコードを持つ可能性があります。

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 に答える