Grails/GORM中findBy查询多结果时如何指定返回最新数据?
解决Grails/GORM中findBy查询返回最新记录的问题
核心结论
findByXXX这类动态查询方法不支持直接指定排序规则——它的设计逻辑就是返回匹配条件的第一条记录,而GORM默认会按主键id升序排列,所以你会拿到旧数据。要获取最新的那条,可采用以下两种方案:
方案1:用findAllBy加排序+限制条数
借助max:1参数让数据库仅返回一条数据,避免不必要的性能消耗,再取结果的第一条:
// 按lastUpdated倒序取最新记录(最准确,适合依赖更新时间判断的场景) Thing.findAllByExternalId(30, [sort: "lastUpdated", order: "desc", max: 1])?.first() // 若id为自增主键,按id倒序性能更优(主键通常带索引) Thing.findAllByExternalId(30, [sort: "id", order: "desc", max: 1])?.first()
方案2:用where查询或Criteria查询
这类方式灵活性更强,可读性也更好,可直接获取单条最新记录:
Where查询写法
Thing.where { externalId == 30 }.sort { it.lastUpdated }.desc().find()
Criteria查询写法
Thing.createCriteria().get { eq("externalId", 30) order("lastUpdated", "desc") }
注意事项
- 如果
lastUpdated是GORM自动维护的字段(默认开启),用它排序是最准确的,能确保拿到最后更新的记录; - 不要直接用
findAllByExternalId(30).sort{...}.first(),这会把所有匹配数据拉到内存后再排序,数据量大时会有明显性能问题。
内容的提问来源于stack exchange,提问作者Rosensweig
相关产品推荐
相关产品推荐

