当前位置: 首页 > 知识库问答 >
问题:

如何使用相同的criteriaQuery对象获取结果列表并进行选择计数

祝俊雄
2023-03-14

我使用criteriaBuilder为特定类型创建criteriaQuery。

CriteriaQuery<? extends File> criteriaQuery = criteriaBuilder.createQuery(Folder.class);

我需要在使用EntityManager的createQuery方法时限制查询的结果。

final TypedQuery<? extends File> query = this.entityManager.createQuery(criteriaQuery)
                .setFirstResult(start).setMaxResults(filePerPage);

但我也需要知道有多少结果我可以得到没有限制,因为我需要它来计算页数的分页系统。

所以我使用了另一个criteriaQueryObject来创建一个选择计数

CriteriaQuery<Long> criteriaQueryCount = criteriaBuilder.createQuery(Long.class);
//creation of the criteriaBuilders from specific types
CriteriaQuery<? extends File> criteriaQuery = criteriaBuilder.createQuery(Folder.class);

CriteriaQuery<Long> criteriaQueryCount = criteriaBuilder.createQuery(Long.class);

//creation of the roots
Root<? extends File> root = criteriaQuery.from(Folder.class),
                     rootCount = criteriaQuery.from(Folder.class);

//list of predicates feeded next
List<Predicate> criteriaList = new ArrayList<>(),
                criteriaCountList = new ArrayList<>();

//adding a join and the predicates
CriteriaBuilder.In<Long> inTagIds = criteriaBuilder.in(root.join("tags", JoinType.INNER).get("id"));
CriteriaBuilder.In<Long> inTagIdsCount = criteriaBuilder.in(rootCount.join("tags", JoinType.INNER).get("id"));

tags.forEach(t -> {
       inTagIds.value(t.getId());
       inTagIdsCount.value(t.getId());
});

criteriaList.add(inTagIds);
criteriaCountList.add(inTagIds);

.... I have almost 10 others filters like this one.

//generating the requests
criteriaQuery.where(criteriaBuilder.and(criteriaList.toArray(new Predicate[0])));

criteriaQuery.distinct(true);

criteriaQueryCount.select(criteriaBuilder.count(rootCount));

criteriaQueryCount.where(criteriaBuilder.and(criteriaCountList.toArray(new Predicate[0])));

final TypedQuery<? extends File> query = this.entityManager.createQuery(criteriaQuery)
                .setFirstResult(searchDto.start).setMaxResults(this.filePerPage);

Long count = this.entityManager.createQuery(criteriaQueryCount).getSingleResult();

List<? extends File> searchRs = query.getResultList();

共有1个答案

裴华荣
2023-03-14

在一个方法中做到这一点的唯一方法是让它使用非类型化的CriteriaQuery(并抑制警告),并返回非类型化的TypedQuery。您可以在执行计数查询时传入一个布尔值,该布尔值告诉它不执行排序等操作。调用方法处理键入,并且必须抑制警告。

希望有一个更优雅的方式,但这是它。它实际上在幕后将所有criteriaquery垃圾转化为JPQL,因此在这种情况下,返回到巨型字符串块几乎更好。

 类似资料:
  • 我的MongoDB数据库有一个结构 每个a文档都有一个带有bool值vield“result”。我进行聚合选择: 并得到一个结果: 如何计算字段“result”中值“true”和“false”的数量,并得到如下结果:

  • 问题内容: 如何获取自定义对象列表,例如查询以下结果: 例如: 我需要一张带有类别ID和类别中产品数量的地图。 问题答案: 不幸的是,JPA没有提供一种标准的方法来检索中的结果。但是,通过遍历结果列表来手动构建地图非常简单:

  • 如何获取自定义对象列表,如以下查询结果: 举例来说: 我需要一个类别ID和类别中的产品数量的地图。

  • 问题内容: 我对JPA 2相当陌生,它是CriteriaBuilder / CriteriaQuery API: Java文档 在Java EE 6教程中 我想计算一个CriteriaQuery的结果而不实际检索它们。那有可能吗,我没有找到任何这样的方法,唯一的办法就是这样做: 那不可能是正确的方法… 有解决方案吗? 问题答案: 类型查询将返回。您要查询。 显然,您将希望使用示例中跳过的任何限制和

  • 我正在做宠物项目和使用NetBeans JFrame。我面临一个问题,我只能计算一个选中的chexBox总数。但是我如何实现一个方法或smth,它可以帮助计算所有选中的CheXBoxes的总数。很高兴回答我该如何执行和计算检查的价格?下面是我的代码和截图

  • 问题内容: 我需要编写一个过程,该过程将允许我选择x数量的行,并同时更新这些行,以便调用应用程序将知道这些记录已锁定并正在使用。我在表中有一个名为“锁定”的列。下次调用该过程时,它将仅提取下一个x数量未选中“锁定”列的记录。我已经阅读了一些有关SQL Server的OUTPUT方法的信息,但是不确定这是我想要做的。 问题答案: 使用OUTPUT投票表决Cade Roux的答案: 之前: 这是我可以