Hibernate 我可以在一个Spring数据JPA存储库方法上使用聚合函数和规范执行@Query吗?
我有一个非常类似的问题。 但在我的例子中,查询将要查找多个sum()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
公共接口库扩展了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
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;
}