gpt4 book ai didi

hibernate - 查询以计算 Grails 中的 bool 属性值

转载 作者:行者123 更新时间:2023-12-02 05:19:02 25 4
gpt4 key购买 nike

我有一个像这样的 grails 域

Point {
User user
Date assignedDate = new Date()
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 完成条件或 hibernate 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')      }    }

最佳答案

您的数据结构化方式和您想要返回的查询不适合条件查询和动态查找器之类的事情。我会根据您的经验水平和需要汇总的数据量来建议这两个选项。

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
}

请注意,我只是随手写了代码,并没有验证语法

希望这对您有所帮助。

关于hibernate - 查询以计算 Grails 中的 bool 属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10226931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com