2010-06-07 3 views
9

Je sais que c'est une question simple, mais prendre plus de tempsgrails trouver d'abord

Comment trouver le premier enregistrement de la table dans les grails.

Je dois obtenir seulement le premier enregistrement sans connaître le numéro d'identification.

Existe-t-il une méthode comme find: first in grails?

merci d'avance.

Répondre

4

Eh bien, vous devez définir par quelle mesure cet enregistrement est censé être le "premier". En supposant que vous voulez dire l'enregistrement avec l'horodatage de création le plus tôt, l'approche la plus simple et la plus robuste serait d'ajouter une propriété dateCreated à votre classe de domaine, puis d'interroger l'entité avec la date la plus basse. En fait, vous n'avez même pas à définir la date de création manuellement, car Grails fait cela pour vous (à condition que vous nommiez la propriété dateCreated) - voir Automatic timestamping dans la documentation Grails.

La requête HQL serait quelque chose comme:

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

ouais.J'ai juste besoin d'aller chercher le premier enregistrement en db indépendamment de l'horodatage. parce que mon horodatage changera toujours quand édité. ne pouvons-nous obtenir sans horodatage? Merci Daniel. – srinath

+0

"parce que mon horodatage changera toujours lors de l'édition" -> Si vous utilisez l'horodatage automatique de Grails, il existe une différence entre 'dateCreated' (une fois insérée et non modifiée par la suite) et' lastUpdated' (mise à jour à chaque mise à jour/changement). –

+0

Si votre identifiant est numérique et auto incrémenté dans l'ordre strictement croissant, vous pouvez bien sûr simplement 'ORDER BY id' –

1

Si l'horodatage n'a pas d'importance, vous pouvez essayer si la réponse de Daniel sans ORDER BY travaux, à savoir

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

Je préfère ne pas compter sur l'hypothèse, que cela renvoie l'objet inséré en premier. AFAIK, il s'agit d'un détail d'implémentation du SGBD et, selon le SGBD que vous utilisez, peut ne pas être vrai. Identique à 'SELECT * FROM xyz LIMIT 1' en langage SQL. –

+0

Quant à MySQL, je viens de trouver ce fil dans le forum: http://forums.mysql.com/read.php?21,239471,239471 Conclusion: Du fait de l'implémentation du moteur, l'ordre par défaut PEUT être l'insert commander (au moins pour MyISAM), mais ce n'est certainement rien sur qui compter! Je suppose que la même chose vaut pour d'autres SGBD. –

12

La mise à jour de Grails 2.1.1 ou version ultérieure ajoute deux nouvelles méthodes (première et dernière) pour que GORM traite cette fonctionnalité nécessaire.

De l'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 plupart de ces méthodes de commodité ne me sont pas utiles car il n'est jamais évident de spécifier une clause where simple. Par exemple, si je voulais trouver la dernière commande faite par une personne, je ne peux pas faire simplement Order.first ([sort: 'orderDateTime', order: 'desc']) car je n'ai pas de table de commande séparée pour chaque utilisateur dans le système. – nogridbag

0

Vous pouvez utiliser les méthodes Grails findBy pour retourner le premier résultat d'une requête.

-> De la 1.3.7 docs

findBy *

Objet

Méthode dynamique qui utilise les propriétés de la classe de domaine pour permettre la création d'Grails expressions de la méthode de requête qui renvoie le premier résultat de la requête

-> de la latest docs

findBy * Objet

méthode dynamique qui utilise les propriétés de la classe de domaine pour exécuter une requête renvoyant le premier résultat correspondant.