3

我有一个像这样的 grails 域

Point {
  User user
  Date assignedDate = new Date()
  consumed = false
}

我想做一个返回用户行的查询,count(consumed=true), count(consumed=false)

例如数据

| USER | DATE | CONSUMED |
___________________________
|   1  | ...  | true     |
|   1  | ...  | true     |
|   1  | ...  | false    |
|   2  | ...  | true     |
|   2  | ...  | false    |

查询必须返回:

| USER | CONSUMED | NOT CONSUMED |
_________________________________
|   1  | 2        | 1            |
|   2  | 1        | 1            |

我必须在单个查询中执行此操作,因为我需要分页。最好使用 gorm 标准或休眠 HQL。

我试过玩投影,但没有成功。

任何想法?谢谢

解决方法

作为一种解决方法,我使用了带有 Michael J. Lee 建议的公式的休眠公式映射。

我添加了两个映射字段

    观点 {
          用户用户
          日期分配日期 = 新日期()
          消耗=假
          免费公式:“CASE WHEN 消费 = 0 THEN 1 ELSE 0 END”
          notFree 公式:“CASE WHEN 消费 = 1 THEN 1 ELSE 0 END”
        }

并使用标准查询,例如:

    Point.withCriteria{
      预测{
          组属性('用户')
          总和('免费')
          总和('notFree')
      }
    }

4

2 回答 2

0

结构化数据的方式和要返回的查询不适合标准查询和动态查找器之类的东西。我会根据您的经验水平以及您需要总结多少数据来建议这两个选项。

1.)创建一个存储过程或使用命名查询(更好地处理大量数据)......

SELECT
   user_id as 'USER',
   SUM(CASE WHEN consumed = 1 THEN 1 ELSE 0 END) as 'CONSUMED'
   SUM(CASE WHEN consumed = 0 THEN 0 ELSE 1 END) as 'NOT CONSUMED'
FROM 
   point
GROUP BY
    user_id

2.) 使用 groovy 的集合闭包在 grails 中完成繁重的工作(如果您有大量数据,请谨慎使用)

def someControllerMethod() {
    def points = Point.list().groupBy{ it.user } //<-- or use a findAllBy or criteria
    def data = [];
    points.each{ point,values ->
        data << ['USER':point.user, 'CONSUMED':values.count{ it.consumed }, 'UNCONSUMED':values.count{ !it.consumed } ]
    }

   println("this is what it looks like ${data}");
   return data //<-- is a list of maps that should be easy to render in your gsp
}

请注意,我只是在脑海中进行了编码,并没有验证语法

希望这可以帮助。

于 2012-04-19T12:45:20.840 回答
-1

在该域上添加一个命名查询并使用 GROUP BY 对您的用户进行分组。您可以在选择子句中使用 COUNT

于 2012-04-19T11:30:04.417 回答