【问题标题】:Non-Trivial Data-Query in GrailsGrails 中的非平凡数据查询
【发布时间】:2011-08-31 08:51:26
【问题描述】:

想象一下 grails 中的以下问题

您有某种具有数字属性的审计跟踪域类。例如一个类,其中写入了您的 scrum 项目的当前燃尽值:

class burndown {
    Date createDate
    int  value
}

每次更新任务时,您的项目都使用此类存储当前燃尽值 - 这意味着一天更新几次。

现在您想用每一天的最后存储值绘制图表。

用于此的 SQL 语句可能类似于

select 
  * 
from 
  table 
where 
  id in (
    select 
      max(id) 
    from 
      table 
    group by 
      TO_CHAR(create_date,'yyyyddmm')
  )

现在我的问题是:你如何在 grails 中进行这样的查询?

如果我必须使用这样的SQL语句,如何避免将表名和列名硬编码在语句中?

PS:此代码尚未经过测试。只是从我的脑海中写下来......但我想你感觉到我想问的内容

【问题讨论】:

  • 你的意思可能是:(select max(id) from table group by...),对吧?
  • btw:我知道,我应该将数据汇总到另一个表中,以免遇到性能问题...
  • 另一件事:如果create_date 字段的类型为date 而不是日期时间,则不需要转换为char。您可以安全地GROUP BY create_date,查询将能够使用(create_date)(create_date, id) 上的索引并高效运行。
  • 将聚合数据放在另一个表中当然是另一种选择,表会变得很大并且查询比接受速度慢。

标签: sql hibernate grails groovy grails-orm


【解决方案1】:

对于初学者,您很可能希望将 createDate 重命名为 dateCreated,因为如果您使用该名称,Grails 会自动为您设置它,因此您只需为类的“真实”属性指定值.不过这对这个问题并不重要。

如果您想要按创建日期的最新项目,有几种不同的方法可以做到这一点,但我认为这是最有意义的:

def mostRecent = Burndown.listOrderByDateCreated(max: 1, order: 'desc')[0]

或者如果你保留你的名字

def mostRecent = Burndown.listOrderByCreateDate(max: 1, order: 'desc')[0]

http://grails.org/doc/latest/ 对此进行了描述——这是一本很好的手册,值得一读。

【讨论】:

  • 好的。从内存中获取了 dateCreated 错误(应该进行大量复制和粘贴)。但我猜你的解决方案只返回最近的项目。我想获得每天的最后一个条目 :-) 所以一个每天只有一个条目的大列表...
  • 试试def mostRecentPerDay = Burndown.executeQuery('from Burndown where id in (select max(id) from Burndown group by cast(dateCreated as date))')
  • cast(dateCreated as date) 仍然会考虑时间。所以我必须使用TO_CHAR(create_date,'yyyyddmm')
【解决方案2】:

不是 Grails 用户,所以下面应该由 Grails'ist 进行相应的更正

如果域相关,请尝试以下操作:

Foo.findAllInList(Bar.list([group:'create_date']))

【讨论】:

  • 我猜一个组是不够的,因为它不能保证我得到每天的最后一项(对不起,我刚刚在我的问题中添加了 max(id))
  • Burt 为 Spring 工作,并且是 Grails 的“重”,所以我会听从他的意见。您是否考虑过将 order:'create_date' 添加到地图参数中?那“应该”分组并订购并每天获得最后一件物品。不妨创建几个简单的测试域并在此处运行建议(将“loggingSql = true”添加到 dataSources 配置中的适用闭包以验证生成的 sql 不仅接近您手动编写的内容,而且还没有加载整个数据库;--))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多