2011-02-22 57 views
4

我有以下類,需要手動增加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) ") 
+1

什麼是你使用檢索最新的數據庫條目,所述方法? – Pat 2011-02-22 23:17:41

+0

......上面貼你 – vector 2011-02-23 02:28:12

+0

可以使用Hibernate的id字段?你可以讓'nextId'成爲一個db序列嗎? – 2011-02-23 13:51:21

回答

2

你可以這樣做:

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

沒有看到整個背景下,很難說出你在做什麼,但是作爲旁白,這看起來相當有疑問。這種將id分配給域對象的方法可能是解決這個問題的錯誤方法。但是在任何情況下,如果在查詢和使用該值之間有一個更大的nextId,新對象被插入到數據庫中呢?

+0

......這正是我擔心,我真正需要的是一個應用廣泛的計數器。所以我會在當天晚些時候發佈更多內容。 – vector 2011-02-23 13:58:00

1

爲什麼不使用序列?您可以使用對所有域類全局的序列,也可以爲該域定義特定的序列。你可以做這樣的事情:

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

..和如果由於某種原因,你還需要有一個nextId,你可以創建一個返回id的值,喜歡的東西get方法:

def getNextId() { 
    return id 
} 

如果你這樣做,那麼你需要將nextId定義爲一個瞬態值。

這當然假設你不需要id和nextId是不同的。

2

關於與

Date dateCreated 

自動填充的Grails,你的域類替換

long timeCreated = new Date().time 

什麼?

那麼你可以做沿着

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

而且線的東西,你知道,在默認情況下的Grails給每個域對象的ID是自動遞增,對不對?

4

我的兩分錢的回報率在最後一排的Grails:

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

應( 「按id DESC LIMIT 1從DomainClass令」)' – ntlam 2015-03-10 09:42:43

+5

@ntlam發現將只得到第一個是'DomainClass.find,的findAll將要求限制1 – pherris 2015-03-20 14:33:04

1

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

最後插入的值轉換成一個連接的標識列是可以通過功能IDENTITY()例如(其中Id是標識列):

INSERT INTO測試(ID,姓名)VALUES(NULL, '測試');
CALL IDENTITY();

因此,假設你使用HSQL,你可以做:

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

獲得最後插入的ID,並添加到它。如果HSQL不是正確的路由,MySQL有它自己的類似功能。

這個答案沒有進行測試。

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 

     } 
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() 
相關問題