Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以将count(*)和groupBy添加到Spring数据Jpa规范中?_Java_Hibernate_Spring Data Jpa_Spring Data_Spring Data Rest - Fatal编程技术网

Java 是否可以将count(*)和groupBy添加到Spring数据Jpa规范中?

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

我正在使用SpringBoot和SpringDataJPA编写一个应用程序

我有一个方法,它使用RSQL(我使用库)和规范对数据库进行带有where子句的过滤器调用

我的存储库:

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