java criteria 排序_java - JPA Criteria Builder的求和列顺序 - 堆栈内存溢出

我有以下SQL查询。

select colA, sum(colB) as colB from tableA group by colA order by colB desc;

我已经使用jpa条件构建器来动态构建查询。

List selectCols = new ArrayList<>();

selectCols.add("colA");

List sumColumns = new ArrayList<>();

sumColumns.add("colB");

List groupByColumns = new ArrayList<>();

groupByColumns.add("colA");

List orderingColumns = new ArrayList<>();

orderingColumns.add("colB");

CriteriaBuilder builder = entityManager.getCriteriaBuilder();

CriteriaQuery cQuery = builder.createQuery(Tuple.class);

Root root = cQuery.from(getDomainClass());

List> selections = new ArrayList<>();

for (String column : selectCols) {

selections.add(root.get(column).alias(column));

}

if (sumColumns != null) {

for (String sumColumn : sumColumns) {

selections.add(builder.sum(root.get(sumColumn)).alias(sumColumn));

}

}

cQuery.multiselect(selections);

List> groupByExpressions = new LinkedList<>();

for (String column : groupByColumns) {

groupByExpressions.add(root.get(column));

}

cQuery.groupBy(groupByExpressions);

List orders = new ArrayList<>();

for (String orderCol : orderingColumns) {

orders.add(builder.desc(root.get(orderCol)));

}

cQuery.orderBy(orders);

entityManager.createQuery(cQuery).getResultList();

我调试并检查了正在执行的确切sql语句。

select colA as col_1_0, sum(colB) as col_2_0 from tableA group by colA order by colB desc;

正在执行的结果sql语句没有colB的别名作为colB。 我正在使用MySql。 出乎意料的是,当sql模式设置为NO_ENGINE_SUBSTITUTION时,该语句得到执行,并且得到了正确的结果。 但是,当sql模式为ONLY_FULL_GROUP_BY时,​​数据库抛出错误,提示

ORDER BY子句的表达式#1不在GROUP BY子句中,并且包含非聚合列'colB',该列在功能上不依赖于GROUP BY子句中的列; 这与sql_mode = only_full_group_by不兼容

我知道在这种模式下,sql会验证查询,而我的查询将失败。 如何使用jpa条件构建器创建别名,以便实际执行的语句包含sum列的适当别名?

注意:我使用spring-data-jpa,这是一个自定义的仓库实现。 我可以使用@Query注释手动编写查询,但是查询的性质在group by,order by,where子句和select列上是动态的。 因此,需要动态标准构建器实施。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值