Java 是否可以将count(*)和groupBy添加到Spring数据Jpa规范中?
我正在使用SpringBoot和SpringDataJPA编写一个应用程序 我有一个方法,它使用RSQL(我使用库)和规范对数据库进行带有where子句的过滤器调用 我的存储库:Java 是否可以将count(*)和groupBy添加到Spring数据Jpa规范中?,java,hibernate,spring-data-jpa,spring-data,spring-data-rest,Java,Hibernate,Spring Data Jpa,Spring Data,Spring Data Rest,我正在使用SpringBoot和SpringDataJPA编写一个应用程序 我有一个方法,它使用RSQL(我使用库)和规范对数据库进行带有where子句的过滤器调用 我的存储库: public interface BaseRepository扩展了JpaRepository,JpaSpecificationExecutor{ } 在服务中,我调用了存储库: String filter=“createdDate>2019-09-04T11:52:59.449”; 返回repository.fin
public interface BaseRepository扩展了JpaRepository,JpaSpecificationExecutor{
}
在服务中,我调用了存储库:
String filter=“createdDate>2019-09-04T11:52:59.449”;
返回repository.findAll(toSpecification(filter),pageable.getContent();
因此,我使用上面的库生成一个规范并将其传递给存储库
现在我需要按一些字段对结果进行分组
如何将计数和分组方式添加到规范中的问题?或者我需要创建一个谓词,在这里我定义了这个计数和groupBy(不知何故),并用它来做一个规范?有什么更好的方法
更新#0
我已经成功地将分组按节添加到结果sql查询中。我创建了一个新的规范对象,在其中定义了所有GROUPBY参数,然后将此规范与原始规范结合起来
String filter=“createdDate>2019-09-04T11:52:59.449”;
规范groupBySpec=新规范(){
@凌驾
公共谓词toPredicate(根根、CriteriaQuery查询、CriteriaBuilder CriteriaBuilder){
列表您可以创建自己的GroupBySpecification
类,该类将groupBy表达式添加到其他规范中:
public class GroupBySpecification implements Specification {
Specification original;
Parameters parameters; // whatever data needed for calculating groupBy expression
public GroupBySpecification(Specification original, Parameters parameters){
this.original = original;
this.parameters = parameters;
}
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
Expression<?> expression = ...; // whatever logic needed to be used on parameters...
criteriaBuilder.groupBy(expression);
return original.toPredicate(root, query, criteriabuilder);
}
如果需要计数,请调用相应的存储库方法:
repository.count(new GroupBySpecification(toSpecification(filter),parameters));
您分组的依据是什么?您能给我们一个您正在查询的类的片段吗?@ROPAS2K应该可以按照从请求http参数(例如orderBy=field1,field2,field3)中获取的不同字段进行分组。这就是过滤器的实际工作方式(我有一个http参数filter=field1,field2…,我分析了它)用于为sql查询创建where子句(问题中的静态字符串仅用于示例)。我试图查询的类非常简单:它只包含许多字段,并且与其他模型没有任何关系。我之所以这样做是因为RSQL看起来只适用于WHERE
子句进行筛选,而不适用于分组。Spring可以执行groupBy
,但您必须为它编写查询,这需要知道该做什么query@locus2k是的,我知道RSQL只适用于WHERE
。问题是如何将group by添加到已由库生成的结果规范中。你到底在说什么样的查询?我现在明白了。可能会检查一下它是否提供了如何做你想做的事情。谢谢你的回复答:事实上我也这么做了,但是我没有为规范创建一个单独的类,而是在我的服务中创建一个新的规范对象,然后使用规范类中的and方法将其组合起来(specObject.and(anotherSpecObject)
)。将更新我的问题以包括此。关于repository.count()方法。不确定它是否是我需要的,因为它只返回结果列表中的多个模型,我需要它作为聚合函数工作(如count(*),并向结果集追加一列)。尽管使用此方法还有另一个问题。尽管我已将group by添加到结果sql查询中,但我需要指定要返回的特定列,这些列在group by节中使用,否则我会收到sql异常错误:列“columnName”必须出现在GROUP BY子句中或在聚合函数中使用。
。我尝试使用CriteriaQuery的方法multiselect,但它仍然选择所有列。因此需要了解如何使用Criteria Api选择特定列,因为如果我使用@Query(“Query”),它工作正常但这不是我的情况。@Coffemanz我也处于同样的情况,我需要一个带有count()的聚合自定义对象,但这样做似乎不可能。我不知道这是可能的
repository.count(new GroupBySpecification(toSpecification(filter),parameters));