QueryDSL中Case Builder表达式的总和

Thr*_*ati 4 mysql querydsl

我有一个如下查询

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)

Dav*_*man 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());
Run Code Online (Sandbox Code Playgroud)