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

是否可以在Spring Data Jpa规范中添加count(*)和groupBy?

翟展
2023-03-14
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();  

现在我需要将一个结果按一些字段分组。

如何将count和groupBy添加到规范中的问题?或者,也许我需要创建一个谓词,在其中定义这个count和groupBy(不知何故),并为此制定一个规范?做这件事的更好的方法是什么?

更新#0

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

我尝试使用multiselectCriteriaQuery.multiselect(root.get("column1“),root.get("column2”)).distinct(true).getGroupRestriction();,但它还是选择了所有列。

如果我使用@query(“query”)来定义要选择的列,它就可以工作,但是我需要它使用criteries API/specification来工作。

共有1个答案

冀弘济
2023-03-14

您可以创建自己的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);
  }

}

然后你可以这样使用它:

String filter = "createdDate > 2019-09-04T11:52:59.449";
return repository.findAll(new GroupBySpecification(toSpecification(filter),parameters),
   pageable).getContent();  
repository.count(new GroupBySpecification(toSpecification(filter),parameters));  
 类似资料:
  • 我的服务提供XML文件的上传。OpenApi规范没有指定模式。我想提供一个输入示例。我试试这个: 然而,大摇大摆的用户界面产生了无用的结果: 是否可以从外部文件中指定示例?

  • 我正在尝试使用python wget下载URL,下载地址为:https://pypi.python.org/pypi/wget 这个包不支持超时选项,因此查询失败大约需要一些时间(大约10秒)。是否可以在try块中添加超时以减少函数的等待时间。 大概是这样的:

  • 问题内容: 我有一个“小时”列,我有一个“种类”列(可以是1,2或3) 我想做类似的事情: 要么 但是mysql告诉我我有一个错误…什么是错误! 请参见以下stackoverflow主题:MySQL SUM IF字段b =字段a ..我无法回复此邮件… 问题答案: 您可以使用以下语句:

  • 问题内容: 我有一个可选参数,它本身支持参数列表。 我的意思是,它应该支持: -f 1 2 -f 1 2 3 但不是: -f 1 -f 1 2 3 4 有没有办法在argparse中强制执行此操作?现在,我使用nargs =“ *”,然后检查列表长度。 编辑: 根据要求,我需要的是能够定义一个可接受数量的参数范围。我的意思是说(在示例中)2或3个args是正确的,但不是1或4或不在2..3范围内的

  • 我注意到在WifiManager类中有一个名为addNetwork的函数,如果我想恢复或保存网络信息(网络名AKA SSID,以及密码和类型),它可能会很有用,这样我也可以连接到它。 我找不到多少关于如何做这样一件事的信息。我看过StackOverflow的各种例子,如果我针对Android API 28(或更低),我确实成功地让它添加了一个网络,甚至连接到它。 然而,当目标是Android29(

  • 问题内容: 是否可以 不 尝试加载就知道是否已加载Java类?尝试加载该类,但我不希望出现这种副作用。还有另一种方法吗? (我不想覆盖类加载器。我正在寻找一个相对简单的方法。) 问题答案: (感谢Aleksi)此代码: 产生: 请注意,示例类不在软件包中。完整的二进制名称是必需的。 二进制名称的一个示例是