2010-06-07 18 views
9

Sé que esta es una pregunta simple pero que toma más tiempograils find first

Cómo encontrar el primer registro de la tabla en los griales.

Necesito obtener solo el primer registro sin conocer el número de identificación.

¿Hay algún método como find: first in grails?

gracias de antemano.

Respuesta

4

Bueno, tienes que definir en qué medida se supone que este registro es el "primero".

Suponiendo que se refiere al registro con la marca de tiempo de creación más antigua, el enfoque más fácil y más sólido sería agregar una propiedad dateCreated a su clase de dominio y luego consultar la entidad con la fecha más baja. De hecho, ni siquiera tiene que establecer la fecha de creación manualmente, porque Grails lo hace por usted (siempre que nombre la propiedad dateCreated) - vea Automatic timestamping en la Documentación de Grails.

La consulta HQL sería algo así como:

def firstObject = YourClass.find("FROM YourClass ORDER BY dateCreated") 
+0

sí.Necesito simplemente buscar el primer registro en db, independientemente de cualquier marca de tiempo. porque mi marca de tiempo siempre cambiará cuando se edite. no podemos obtener sin marca de tiempo? Gracias Daniel. – srinath

+0

"porque mi marca de tiempo siempre cambiará cuando se edite" -> Si usa el sello automático de fecha y hora de Grails, hay una diferencia entre 'dateCreated' (establecido una vez y luego no modificado) y' lastUpdated' (actualizado con cada actualización/cambio) –

+0

Si su id. Es numérica y se incrementa automáticamente en orden estrictamente ascendente, podría simplemente 'ORDER BY id' –

1

Si marca de tiempo no importa, puede probar si la respuesta de Daniel sin orden por las obras, es decir

def firstObject = YourClass.find("FROM YourClass") 
+0

Preferiría no confiar en la suposición de que esto devuelve el objeto insertado primero. AFAIK, este es un detalle de implementación del DBMS y, dependiendo del DBMS que use, puede no ser cierto. Lo mismo que con 'SELECT * FROM xyz LIMIT 1' en SQL simple. –

+0

En cuanto a MySQL, acabo de encontrar este hilo en el foro: http://forums.mysql.com/read.php?21,239471,239471 Conclusión: debido a la implementación del motor, el orden predeterminado PUEDE ser el inserto orden (al menos para MyISAM), ¡pero definitivamente no es nada en lo que confiar! Supongo que lo mismo vale para otros DBMS. –

12

La actualización a Grails 2.1.1 o posterior agrega dos nuevos métodos (el primero y el último) para GORM para abordar esta función necesaria.

Desde el docs:

class Person { 
    String firstName 
    String lastName 
    Integer age 
} 

// retrieve the first person ordered by the identifier 
def p = Person.first() 
// retrieve the first person ordered by the lastName property 
p = Person.first(sort: 'lastName') 

// retrieve the first person ordered by the lastName property 
p = Person.first('lastName') 
+1

La mayoría de estos métodos de conveniencia no son útiles para mí, ya que nunca es obvio cómo podría especificar una cláusula where simple. Por ejemplo, si quería encontrar el último pedido realizado por una persona, no puedo simplemente hacer Order.first ([sort: 'orderDateTime', order: 'desc']) ya que no tengo una tabla de pedidos separada para cada usuario en el sistema. – nogridbag

0

Puede utilizar los griales findBy métodos para devolver el primer resultado de una consulta.

-> Desde el 1.3.7 docs

findBy *

Propósito

método dinámico que utiliza las propiedades de la clase de dominio para permitir la creación de Grails expresiones método de consulta que devuelve la primera resultado de la consulta

-> Del latest docs

findBy * Propósito

método dinámico que utiliza las propiedades de la clase de dominio para ejecutar una consulta devolver el primer resultado de la casación.