【问题标题】:How to do JPA query with Criteria Clause?如何使用 Criteria Clause 进行 JPA 查询?
【发布时间】:2012-12-19 11:56:29
【问题描述】:

首先我想做一个类似

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

其中 tagArray 是“'tag1','tag2','tag3'”。那么我想做一个分页查询:

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

我不知道如何编写这个查询。搜了帖子,没找到答案,有大神给点建议吗?谢谢。

【问题讨论】:

    标签: java jpa pagination criteria-api


    【解决方案1】:

    这里是示例代码:

    // 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();
    

    【讨论】:

      【解决方案2】:

      非常感谢!按照你的指示,我做了这个,有点复杂。

          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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-20
        • 2014-09-05
        • 1970-01-01
        • 2011-08-01
        • 2015-09-16
        • 2014-09-04
        • 1970-01-01
        相关资源
        最近更新 更多