Grails 如何检索最新创建的数据库条目?

Grails 如何检索最新创建的数据库条目?,grails,groovy,Grails,Groovy,我有以下类,需要手动递增nextId字段 class SomeIdClass { Family family Integer nextId = 0 long timeCreated = new Date().time } 到目前为止,我一直在试图检索和最新的数据库条目来增加它,我只是没有任何运气。还是我只是用了一种完全错误的方式 塔克斯 ps:这是我尝试过的,但是得到了Package.SomeId对象的列表 def si = SomeId.executeQuery(" from SomeI

我有以下类,需要手动递增nextId字段

class SomeIdClass {

Family family
Integer nextId = 0
long timeCreated = new Date().time }
到目前为止,我一直在试图检索和最新的数据库条目来增加它,我只是没有任何运气。还是我只是用了一种完全错误的方式

塔克斯

ps:这是我尝试过的,但是得到了Package.SomeId对象的列表

 def si = SomeId.executeQuery(" from SomeId where nextId =  (select max( nextId ) from SomeId) ")
您可以这样做:

def maxNextId = DomainClass.executeQuery("select max(nextId) from DomainClass")[0]

如果看不到整个背景,很难判断你在做什么,但顺便说一句,这看起来很可疑。这种将ID分配给域对象的方法可能是错误的。但在任何情况下,如果在执行查询和使用该值之间,新对象以更大的nextId插入数据库,该怎么办?

为什么不使用序列?您可以使用所有域类的全局序列,也可以为该域定义特定序列。您可以这样做:

static mapping = {
    id generator: 'sequence', params: [sequence: 'some_name_sequence']
}
…如果出于某种原因,您仍然需要一个nextId,那么您可以创建一个get方法来返回id的值,类似于:

def getNextId() {
  return id
}
如果这样做,则需要将nextId定义为瞬态值

这当然是假设您不需要id和nextId不同。

替换如何

long timeCreated = new Date().time

哪些grails会自动填充到您的域类中

然后你可以按照

SomeIdClass.listOrderByDateCreated(max: 1, order: "desc")

另外,您知道,默认情况下,grails为每个域对象提供一个自动递增的id,对吗?

My Second for return the last row in grails:

DomainClass.find("from DomainClass order by id desc")

可以使用函数identity()为连接的标识列插入最后一个值,例如(其中Id是标识列):

在测试(Id,Name)值中插入(NULL,'Test')
调用标识()

因此,假设您使用的是HSQL,您可能能够做到:

SomeIdClass.executeQuery("call identity();")
获取最后插入的ID并添加到其中。如果HSQL不是正确的路由,MySQL也有自己类似的特性


此答案未经测试。

您只需通过以下方式获取上次保存的值:

// retrieve the last person

def p = Person.last()

//get the current id
def currentId = p.id

//increment the id manually
def nextId = currentId+1


You can also use the generator in the domain class mappings.



    static mapping = {
            table 'PERSON'
            id  generator: 'increment'
            version false

        }
 //works only if the primary key 'id' is non-composite
 def lastEntry = SomeIdClass.last(sort: 'id')


//alternative method which will work even for composite primary key
def entryList= SomeIdClass.findAll{[sort:'id',order:'asc']}.last()
嗯,试试看

SomeIdClass.where {
   // any criteria - or none
}.max('nextId').list()[0]

但是您当然应该使用id序列生成器。

检索最新数据库条目的方法是什么?可以使用Hibernate的id字段吗?你能做一个db序列吗?。。。这正是我所担心的,我真正需要的是一个应用程序范围的计数器。因此,我将在今天晚些时候发布更多内容。您所说的最后[0]是什么意思@ataylor应该是
DomainClass.find(“从DomainClass order by id desc LIMIT 1”)
@ntlam find将只获取第一个,findAll将要求限制1
SomeIdClass.where {
   // any criteria - or none
}.max('nextId').list()[0]