我正在使用Spring Boot和Spring Data Jpa编写应用程序。
我有一个方法,使用RSQL(我使用这个库)和规范来进行过滤调用,将where子句传递给数据库。
我的存储库:
public interface BaseRepository<M extends BaseModel> extends JpaRepository<M, Long>, JpaSpecificationExecutor<M>{
}
在这个服务中,我调用了仓库:
String filter = "createdDate > 2019-09-04T11:52:59.449";
return repository.findAll(toSpecification(filter), pageable).getContent();
我使用上述库生成规范,然后将其传递给存储库。
现在我需要按某些字段对结果进行分组。
问题是如何向规范中添加计数和分组?或者我需要创建一个谓词,在其中定义此计数和分组(某种方式),并从此创建规范?有什么更好的方法吗?
更新#0
我已成功将分组部分添加到结果SQL查询中。我创建了一个新的规范对象,在其中定义了所有分组参数,然后将此规范与原始规范组合。
String filter = "createdDate > 2019-09-04T11:52:59.449";
Specification<M> groupBySpec = new Specification<M>() {
@Override
public Predicate toPredicate(Root<M> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Expression<?>> groupByParams = new ArrayList<>();
groupByParams.add(root.get("param1"));
groupByParams.add(root.get("param2"));
query.groupBy(groupByParams);
return query.getGroupRestriction();
}
};
return repository.findAll(groupBySpec.and(toSpecification(filter)), pageable).getContent();
问题在于它总是选择所有列,但我需要只选择那些在group by部分的列。
结果会得到一个SQL异常:ERROR: column "columnName" must appear in the GROUP BY clause or be used in an aggregate function.
我已经尝试使用这样的多选项multiselect:
criteriaQuery.multiselect(root.get("column1"), root.get("column2")).distinct(true).getGroupRestriction();
但它仍然选择所有列。如果我使用
@Query("query")
它可以工作,但我需要使用Criteria Api/Specification操作。
WHERE
。问题是如何将分组添加到已由库生成的结果规范中。您具体指的是什么样的查询? - Coffemanz