Как получить последнюю созданную запись в БД? - PullRequest
4 голосов
/ 23 февраля 2011

У меня есть следующий класс, и мне нужно вручную увеличить поле 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 ]

4 голосов
/ 10 апреля 2012

Мои два цента за возврат последнего ряда в Граалях:

DomainClass.find("from DomainClass order by id desc")
2 голосов
/ 24 февраля 2011

Как насчет замены

long timeCreated = new Date().time

на

Date dateCreated 

, который автоматически заполняется в вашем доменном классе?

Тогда вы можете сделать что-то вроде

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

Кроме того, вы знаете, что по умолчанию grails дает каждому объекту домена идентификатор, который автоматически увеличивается, верно?

2 голосов
/ 23 февраля 2011

Вы можете сделать это:

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

Не видя весь контекст, трудно сказать, что вы делаете, но в целом это выглядит довольно сомнительным.Этот метод назначения идентификаторов доменным объектам, вероятно, является неправильным способом.Но в любом случае, что, если новый объект будет вставлен в базу данных с большим значением nextId между временем выполнения запроса и использованием значения?

1 голос
/ 27 октября 2017

Вы можете просто получить последнее сохраненное значение следующим образом:

 //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()
1 голос
/ 12 июля 2013

С 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();")

, чтобы получить последний вставленный идентификатор и добавить к нему. MySQL имеет свою аналогичную функцию, если HSQL не правильный маршрут.

Этот ответ НЕ ПРОВЕРЕН.

1 голос
/ 23 февраля 2011

Почему бы не использовать последовательность?Вы можете использовать последовательность, которая является глобальной для всех классов вашего домена, или вы можете определить конкретную последовательность для этого домена.Вы можете сделать что-то вроде этого:

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

.. и если по какой-то причине вам все еще нужно иметь nextId, вы можете создать метод get, который возвращает значение id, что-то вроде:

def getNextId() {
  return id
}

Если вы сделаете это, вам нужно будет определить nextId как временное значение.

Это, конечно, при условии, что вам не нужны id и nextId, чтобы отличаться.

0 голосов
/ 19 июля 2018

Ммм, попробуйте

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

Но, конечно, вы должны использовать генератор последовательности для идентификаторов.

0 голосов
/ 29 августа 2017
// 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

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...