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

时间:2011-02-22 21:32:57

标签: grails groovy

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

class SomeIdClass {

Family family
Integer nextId = 0
long timeCreated = new Date().time }

到目前为止,我一直在尝试检索和最新的数据库条目来增加它,我只是没有运气。或者我只是以完全错误的方式解决这个问题?

Thaks

ps:这是我尝试过但获取Package.SomeId对象列表

 def si = SomeId.executeQuery(" from SomeId where nextId =  (select max( nextId ) from SomeId) ")

8 个答案:

答案 0 :(得分:4)

我在Grails的最后一行返回两分钱:

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

答案 1 :(得分:2)

你可以这样做:

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

如果没有看到整个背景,很难说出你在做什么,但另外,这看起来很可疑。将id分配给域对象的方法可能是错误的方法。但无论如何,如果在执行查询和使用值之间将新对象插入到具有更大nextId的数据库中会怎样?

答案 2 :(得分:2)

如何替换

long timeCreated = new Date().time

Date dateCreated 

哪个grails会自动填充到您的域类?

然后你可以按照

的方式做点什么
SomeIdClass.listOrderByDateCreated(max: 1, order: "desc")

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

答案 3 :(得分:1)

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

static mapping = {
    id generator: 'sequence', params: [sequence: 'some_name_sequence']
}

..如果由于某种原因你还需要一个nextId,你可以创建一个返回id值的get方法,如:

def getNextId() {
  return id
}

如果你这样做,那么你需要将nextId定义为瞬态值。

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

答案 4 :(得分:1)

来自http://www.hsqldb.org/doc/guide/ch09.html#create_table-section

  

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

     

INSERT INTO Test(Id,Name)VALUES(NULL,'Test');
  CALL IDENTITY();

因此,假设您正在使用HSQL,您可以这样做:

SomeIdClass.executeQuery("call identity();")

获取最后插入的ID并添加到其中。如果HSQL不是正确的路径,MySQL也有自己的类似功能。

此答案未经过测试。

答案 5 :(得分:1)

您可以这样简单地获取上次保存的值:

 //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()

答案 6 :(得分:0)

// 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

        }

答案 7 :(得分:0)

嗯,尝试

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

但是,您当然应该使用ID的序列生成器。