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

我可以在一个Spring DataJPA存储库方法上执行@Query带规范的聚合函数吗?

叶书
2023-03-14

我有非常类似于以前问的问题。除了在我的情况下查询是要找到多个和()

public interface IQuotaRepository extends JpaRepository<QuotaDao, Long>, JpaSpecificationExecutor<QuotaDao> {

        @Query( "select new ca.quota.kpi.model.dto.TotalDto(sum(q.value1), sum(q.value2), sum(q.value3), sum(q.value4), "
                                                                + "sum(q.value5), sum(q.value6), sum(q.value7), sum(q.value8), "
                                                                + "sum(q.value9), sum(q.value10), sum(q.value11), sum(q.value12)) from QuotaDao q")
        public TotalDto sumQuota();//Specification<QuotaDao> spec

        @Query( "select new ca.quota.kpi.model.dto.TotalDto(sum(q.value1), sum(q.value2), sum(q.value3), sum(q.value4), "
                                                                + "sum(q.value5), sum(q.value6), sum(q.value7), sum(q.value8), "
                                                                + "sum(q.value9), sum(q.value10), sum(q.value11), sum(q.value12)) from QuotaDao q")
        public TotalDto sumQuotaWithSpec(Specification<QuotaDao> spec);
}
  • sumQuota()工作正常

我希望重用“规范规范”来过滤来自网格控制的各种参数的结果。

你能建议任何解决方案或替代方案吗

共有1个答案

扶开诚
2023-03-14

好我发现解决方案可能比严格的JPA方法更有效

首先,我在存储库接口中声明了方法

public interface IQuotaRepositoryCustom{

    public TotalDto sumQuotaWithFilters(FilterParameterExtJs6[] filters);
    ...
}

然后在存储库实现中实现此方法

@Repository
public class IQuotaRepositoryImpl implements IQuotaRepositoryCustom {
    private static Logger logger = Logger.getLogger(IQuotaRepositoryImpl.class);    
    private final String SELECT_COUNT_FOR_TOTAL = "select count(*)";
    private final String SELECT_COUNT_FOR_TOTAL_QUOTA = SELECT_COUNT_FOR_TOTAL + " from QuotaDao q";
    private final String SELECT_TOTAL = "select new org.avp.quota.kpi.model.dto.TotalDto(sum(q.value1), sum(q.value2), sum(q.value3), sum(q.value4), "
                                                                                    + "sum(q.value5), sum(q.value6), sum(q.value7), sum(q.value8), "
                                                                                    + "sum(q.value9), sum(q.value10), sum(q.value11), sum(q.value12))";

private final String SELECT_TOTAL_QUOTA = SELECT_TOTAL + " from QuotaDao q";
    ...
    public TotalDto sumQuotaWithFilters(FilterParameterExtJs6[] filters) {
        String countHql = SELECT_COUNT_FOR_TOTAL_QUOTA + buildWhereClause(filters);
        Query countQuery = em.createQuery(countHql.toString());
        Long count = (Long)countQuery.getSingleResult();
        if(count.longValue() == 0L)
            return new TotalDto();
        String hql = SELECT_TOTAL_QUOTA+ buildWhereClause(filters);
        Query query = em.createQuery(hql.toString());
        return (TotalDto) query.getSingleResult();
    }
}

TotalDto是普通的数据传输对象

    public class TotalDto {

        private long value1;
        private long value2;
        private long value3;
        private long value4;
        private long value5;
        private long value6;
        private long value7;
        private long value8;
        private long value9;
        private long value10;
        private long value11;
        private long value12;
        private long total;
// constructor and getters/setters removed
}

顾名思义,localhelper函数只是构建where子句字符串(我不发布代码,因为来自UI的非常特定的格式)

private String buildWhereClause(FilterParameterExtJs6[] filterParameters) {
    StringBuffer sb = new StringBuffer();
    // Build where clause string 
    return sb.toString();
}

最后,在服务中调用此存储库方法

public TotalDto getFilteredSummAggregateQuota(final FilterParameterExtJs6[] filterParameters){
    TotalDto aggregateTotalQuota = quotaRepository.sumQuotaWithFilters(filterParameters);
    return aggregateTotalQuota;
}

希望这能帮助你四处走动。

 类似资料:
  • 问题内容: 是否可以在一种存储库方法中同时使用注释和规范?例如,我想要一个这样的方法: 是否可以或应该将整个查询构建为a 并删除注释? 问题答案: 首先,您可能想阅读此博客文章。其次,根据存储库应实现的接口,可以使用“规范”运行以下查询: 因此,您不能混合使用(或查询方法)和s。 您可以表达这种情况: 使用一个代替。然后,您可以根据需要组合任意多个规格。

  • 问题内容: 是否可以在一种存储库方法中同时使用注释和规范?例如,我想要一个这样的方法: 是否可以或应该将整个查询构建为a 并删除注释? 问题答案: 首先,你可能想先阅读此博客文章。其次,根据存储库应实现的接口,可以使用“规范”运行以下查询: 因此,你无需将s @Query(或查询方法)混合使用Specification。 你可以表达这种情况: 使用一个代替。然后,你可以根据需要组合任意多个规格。

  • 是否可能或者应该将整个查询构建为并删除注释?

  • 如何使用规范编写下面查询 当我们使用Specification时,即使在multiselect中提到了count(),也没有选择count()。 为什么JPA中的multiselect方法不起作用

  • 问题内容: 我可以在mysql中使用聚合函数(LAST)吗? 如果是,那么为什么给我以下查询错误: 错误 ::您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以在第1行的’()FROM group by ‘ 附近使用正确的语法 编辑 ::我得到答案“最后一个”不在MySql中使用。那么如何在MySql中执行呢? 问题答案: 不,在mysql中没有所谓的LAST 查看汇总函数列表

  • 我有很多相同类的实例。现在这些对象可以被链接并且这个链接可以有一个权重。就像在无向图中一样。现在我想在我的mysql数据库中存储每两个对象之间的关系。 数据如下所示 我可以创建一个具有以下结构的表: 但是在搜索两个对象之间的权重时,我不知道哪个是和哪个是。所以我需要写两个查询。此外,如果我想添加权重,并且想首先检查它是否已经在我的数据库中,我必须编写两个查询以确保它不在其中。 这两个问题是: 以确