yas*_*nth 2 java mysql jpa spring-data-jpa
我有以下SQL查询。
select colA, sum(colB) as colB from tableA group by colA order by colB desc;
Run Code Online (Sandbox Code Playgroud)
我已经使用jpa条件构建器来动态构建查询。
List<String> selectCols = new ArrayList<>();
selectCols.add("colA");
List<String> sumColumns = new ArrayList<>();
sumColumns.add("colB");
List<String> groupByColumns = new ArrayList<>();
groupByColumns.add("colA");
List<String> orderingColumns = new ArrayList<>();
orderingColumns.add("colB");
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> cQuery = builder.createQuery(Tuple.class);
Root<T> root = cQuery.from(getDomainClass());
List<Selection<?>> 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<Expression<?>> groupByExpressions = new LinkedList<>();
for (String column : groupByColumns) {
groupByExpressions.add(root.get(column));
}
cQuery.groupBy(groupByExpressions);
List<Order> orders = new ArrayList<>();
for (String orderCol : orderingColumns) {
orders.add(builder.desc(root.get(orderCol)));
}
cQuery.orderBy(orders);
entityManager.createQuery(cQuery).getResultList();
Run Code Online (Sandbox Code Playgroud)
我调试并检查了正在执行的确切sql语句。
select colA as col_1_0, sum(colB) as col_2_0 from tableA group by colA order by colB desc;
Run Code Online (Sandbox Code Playgroud)
正在执行的结果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列上是动态的。因此,需要动态标准构建器实施。
小智 5
尝试对汇总进行排序。以我的经验,列别名通常不能在查询本身中引用。
orders.add(builder.desc(builder.sum(sumColumn)));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2565 次 |
| 最近记录: |