我有一个如下查询
select field1,filed2,count(*),
sum(case isNew WHEN 0 THEN 0 ELSE 1 END) as new_count1,
sum(case source WHEN 'SomeValue' THEN 0 ELSE 1 END) as new_count2
from TABLE
where status='processed'
and filed1='filed1Value'
and filed2='field2Value';
Run Code Online (Sandbox Code Playgroud)
这个输出是一行包含我需要的所有值.我想使用queryDSL实现相同的功能.我在QueryDSL中使用CaseBuilder但无法在其上应用总和.. QueryDsl是否支持?有没有人解决过这个问题?
Expression<Integer> sourceCases = qTable.source.
when(matchedValue1).then(new Integer(1)).
otherwise(new Integer(0));
Expression<Integer> newAccountCases = qTable.isNew.
when(matchedValue2).then(new Integer(1)).
otherwise(new Integer(0));
return queryDslJdbcTemplate.queryForObject(sqlQuery,
new Mapping(qTable.filed1,
qTable.filed2,
qTable.id.count(),
####SUM( (sourceCases) )###,
####SUM( (newAccountCases) )###);
Run Code Online (Sandbox Code Playgroud)
基类Expression不允许您应用聚合.如果你注意到,你的else子句实际上返回NumberExpression.您需要做的就是使用该类型而不是Expression.所以你的代码可能变成:
NumberExpression<Integer> sourceCases = qTable.source.
when(matchedValue1).then(new Integer(1)).
otherwise(new Integer(0));
NumberExpression<Integer> newAccountCases = qTable.isNew.
when(matchedValue2).then(new Integer(1)).
otherwise(new Integer(0));
return queryDslJdbcTemplate.queryForObject(sqlQuery,
new Mapping(qTable.filed1,
qTable.filed2,
qTable.id.count(),
sourceCases.sum(),
newAccountCases.sum());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2327 次 |
| 最近记录: |