查询以计算Grails中的布尔属性值

时间:2012-04-19 11:20:09

标签: hibernate grails groovy gorm

我有像这样的grails域

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

我想做一个返回行的查询 user,count(consume = true),count(consume = 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。

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

有什么想法吗? 谢谢

解决方法

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

我已将两个映射字段添加到


    Point {
          User user
          Date assignedDate = new Date()
          consumed = false
          free formula: "CASE WHEN consumed = 0 THEN 1 ELSE 0 END"
          notFree formula: "CASE WHEN consumed = 1 THEN 1 ELSE 0 END"
        }

并使用标准查询,例如:


    Point.withCriteria{ 
      projections {
          groupProperty('user')
          sum('free')
          sum('notFree')
      }
    }

2 个答案:

答案 0 :(得分: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
}

请注意,我刚刚完成了编码,但没有验证语法

希望这有帮助。

答案 1 :(得分:-1)

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