-1

まず、次のようなクエリを実行します

"select count(*) from Post p where p.tag in (tagArray) "

ここで、tagArrayは "'tag1'、'tag2'、'tag3'"です。次に、ページ分割クエリを実行します。

query.setFirstResult(int1).setMaxResult(int2);

このクエリの書き方がわかりません。投稿を検索しましたが、答えが見つかりませんでした。誰かアドバイスをいただけますか?ありがとう。

4

2 に答える 2

2

サンプルコードは次のとおりです。

// get an entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaManager");
EntityManager em = emf.createEntityManager();
// create query
Query query = em.createQuery("select count(*) from Post p where p.tag in (tagArray)") // use parameters here when necessary 
            .setFirstResult(int1)
            .setMaxResults(int2);
// get result
query.getResultList();

アップデート:

条件ごとにクエリを作成する場合は、次のことを試してください。

CriteriaBuilder builder = em.getCriteriaBuilder(); // em is as the same the the above
CriteriaQuery<Post> query = builder.createQuery(Post.class);
Root<Post> post = query.from(Post.class);
query.select(post).where(post.get("tag").in("tag1", "tag2", "tag3")); // or pass a tag collection to `in` method
TypedQuery<Post> typedQuery = em.createQuery(query);
List<Post> results = typedQuery.setFirstResult(int1).setMaxResults(int2)
                     .getResultList();
于 2013-01-05T01:31:25.050 に答える
0

どうもありがとうございます!あなたの指示に従って、私は少し複雑なこのようにそれをしました。

    public List<Post> findPostBySitePaged(Set sites, Page page) {
    List<Post> result = new ArrayList<Post>();
    if (sites == null || sites.size() == 0) return result;

    try {
        CriteriaBuilder builder = em.getCriteriaBuilder();

        CriteriaQuery<Long> cQuery = builder.createQuery(Long.class);
        Root<Post> root = cQuery.from(Post.class);

        CriteriaQuery<Long> select = cQuery.select(builder.count(root));
        select.where(root.get("site").in(sites));

        TypedQuery<Long> typedQuery = em.createQuery(select);
        Long t = typedQuery.getSingleResult();

        int tot = t.intValue() / page.getPageSize() + ((t.intValue() % page.getPageSize()) == 0 ? 0 : 1);
        page.setTotal(tot);

        CriteriaQuery<Post> criteriaQuery = builder.createQuery(Post.class);
        root = criteriaQuery.from(Post.class);
        criteriaQuery.select(root).where(root.get("site").in(sites)).orderBy(builder.desc(root.get("createDate")));

        TypedQuery<Post> postQuery = em.createQuery(criteriaQuery);
        postQuery.setFirstResult((page.getCurrent() - 1) * (page.getPageSize())).setMaxResults(page.getPageSize());

        result = postQuery.getResultList();

    } catch (Exception e) {
        log.error(e.getMessage());
    }

    return result;
}
于 2013-01-14T03:04:37.107 に答える