Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Hibernate 我可以在一个Spring数据JPA存储库方法上使用聚合函数和规范执行@Query吗?_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Hibernate 我可以在一个Spring数据JPA存储库方法上使用聚合函数和规范执行@Query吗?

Hibernate 我可以在一个Spring数据JPA存储库方法上使用聚合函数和规范执行@Query吗?,hibernate,jpa,spring-data-jpa,Hibernate,Jpa,Spring Data Jpa,我有一个非常类似的问题。 但在我的例子中,查询将要查找多个sum() 公共接口库扩展了JpaRepository,JpaSpecificationExecutor{ @查询(“选择新的ca.quota.kpi.model.dto.TotalDto(总和(q.value1)、总和(q.value2)、总和(q.value3)、总和(q.value4),” +求和(q.value5)、求和(q.value6)、求和(q.value7)、求和(q.value8) +“来自报价单q的总和(q.value

我有一个非常类似的问题。 但在我的例子中,查询将要查找多个sum()

公共接口库扩展了JpaRepository,JpaSpecificationExecutor{
@查询(“选择新的ca.quota.kpi.model.dto.TotalDto(总和(q.value1)、总和(q.value2)、总和(q.value3)、总和(q.value4),”
+求和(q.value5)、求和(q.value6)、求和(q.value7)、求和(q.value8)
+“来自报价单q的总和(q.value9)、总和(q.value10)、总和(q.value11)、总和(q.value12))
public TotalDto sumQuota();//规范规范
@查询(“选择新的ca.quota.kpi.model.dto.TotalDto(总和(q.value1)、总和(q.value2)、总和(q.value3)、总和(q.value4),”
+求和(q.value5)、求和(q.value6)、求和(q.value7)、求和(q.value8)
+“来自报价单q的总和(q.value9)、总和(q.value10)、总和(q.value11)、总和(q.value12))
公共总计至sumQuotaWithSpec(规范规范);
}
  • sumQuota()工作正常
  • sumQuotaWithSpec(规范规范规范)抛出 QueryParameterException:位置超出已声明序数参数的数量。请记住,序数参数是基于1的!职位:1
我希望重用“规范规范”来过滤来自网格控制的各种参数的结果

请您提供解决方案或替代方案好吗。。。 我发现解决方案可能比严格的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的非常特定的格式)

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

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

希望这能帮助你解决问题。

你得到答案了吗,我也面临同样的问题。@Anchit Pancholi。我已经发布了答案OK,但这不是JPA的正确方式,所以我使用了QueryDSL。@AlexeiP,请参阅-。“这也解释了关系。”Shamseer非常有趣。非常感谢。
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;
}