Grails:如何获取最后插入的记录匹配查询

时间:2015-06-28 21:01:39

标签: grails

在SQL中获取最后一条记录是微不足道的,例如(对于MySQL)

class ExchangeRate {
    Currency from  
    Currency to  
    BigDecimal rate // e.g. 10
    Date dateCreated
}
class Currency {
    String iso
    etc..
}

获取最新信息的SQL很简单:

Select max(id), rate 
from exchange_rate 
where from_id = 1
  and to_id = 3

select rate 
from exchange_rate
where from_id = 2
order by id desc
limit 1

问题是,如何在Grails中有效地做到这一点?我只想要一个结果。

这显然不会起作用:

    def query = ExchangeRate.where {
        from == from && to == to && id == max(id)
    }
    ExchangeRate exchangeRate = query.find()

有几个帖子,但没有一个实际的答案,我可以弄清楚如何申请(我是一个SQL人,不知道hibernate语言,并希望解决方案,如果没有涉及它,如果有一个)

如果有一种简单的方法可以直接运行SQL而无需手动管理可行的结果集(因为我们永远不会使用除MySQL之外的其他数据库)

我确信它可以通过排序和限制来完成,但是a)没有找到我可以复制的示例,并且b)会认为这是低效的,因为看起来排序和限制是在代码中完成的,不是SQL?

此示例位于文档中:

Book.findAll("from Book as b where b.author=:author",
         [author: 'Dan Brown'], [max: 10, offset: 5])

可能导致这个:

def exchangeRates = ExchangeRate.findAll("from ExchangeRate as e where e.from = :from order by id desc", [from: from], [max: 1])

if (exchangeRates.size() == 1) {
    return exchangeRates.first().rate
}
return null

有没有更好的方法(例如,不使用hibernate低级语言,或使用SQL的方法,或者更有效的方法?)

1 个答案:

答案 0 :(得分:1)

根据documentation尝试使用子查询。

def query = ExchangeRate.where {
  id = max(id).of { from == fromValue } && to == toValue
}

query.find()