我有一个如下的查询
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';
这是一行包含我需要的所有值。 我想使用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) )###);
答案 0 :(得分:6)
基类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());