2010-06-07 2 views
9

Ich weiß, das ist einfache Frage, aber dauert mehr ZeitGrails zuerst finden

So finden Sie den ersten Datensatz aus der Tabelle in Grails.

Ich brauche nur den ersten Datensatz ohne zu wissen, die ID-Nummer.

Gibt es irgendeine Methode wie finden: zuerst in Grails?

danke im voraus.

Antwort

4

Nun, Sie müssen definieren, mit welchem ​​Maß dieser Datensatz der "erste" sein soll.

Angenommen, Sie meinen den Datensatz mit dem frühesten Erstellungszeitstempel, wäre der einfachste und robusteste Ansatz, Ihrer Domänenklasse eine dateCreated-Eigenschaft hinzuzufügen und dann nach der Entität mit dem niedrigsten entsprechenden Datum zu suchen. In der Tat müssen Sie das Erstellungsdatum nicht einmal manuell festlegen, da Grails dies für Sie erledigt (solange Sie die Eigenschaft dateCreated benennen) - siehe Automatic timestamping in der Grails-Dokumentation.

Die HQL Abfrage wäre so etwas wie:

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

ja.Ich brauche nur den ersten Datensatz in db unabhängig von einem Zeitstempel zu holen. weil mein Zeitstempel sich immer ändert, wenn er bearbeitet wird. können wir nicht ohne Zeitstempel? Danke Daniel. – srinath

+0

"weil sich mein Zeitstempel immer ändert, wenn er bearbeitet wird" -> Wenn Sie Grails 'automatischen Zeitstempel verwenden, gibt es einen Unterschied zwischen' dateCreated' (einmal gesetzt und danach nicht geändert) und 'lastUpdated' (aktualisiert bei jeder Aktualisierung/Änderung)). –

+0

Wenn Ihre ID numerisch ist und automatisch in aufsteigender Reihenfolge inkrementiert wird, könnten Sie natürlich nur 'ORDER BY id ' –

1

Wenn Zeitstempel, spielt keine Rolle, könnten Sie versuchen, wenn Daniel Antwort ohne ORDER BY Werke, dh

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

Ich würde mich lieber nicht auf die Annahme verlassen, dass dies das zuerst eingefügte Objekt zurückgibt. AFAIK, dies ist ein Implementierungsdetail des DBMS und abhängig von dem DBMS, das Sie verwenden, stimmt möglicherweise nicht. Selben wie bei 'SELECT * FROM xyz LIMIT 1' in normalem SQL. –

+0

Wie für MySQL, habe ich gerade diesen Thread im Forum gefunden: http://forums.mysql.com/read.php?21,239471,239471 Fazit: Aufgrund der Implementierung der Engine, kann die Standard-Reihenfolge der einfügen bestellen (zumindest für MyISAM), aber das ist definitiv nichts, auf das man sich verlassen kann! Ich nehme an, das gleiche gilt für andere DBMS. –

12

Die Aktualisierung auf Grails 2.1.1 oder höher fügt zwei neue Methoden (erste und letzte) für GORM hinzu, um diese benötigte Funktion zu adressieren.

Vom 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

Die meisten dieser Bequemlichkeitsmethoden sind für mich nicht nützlich, da es nie offensichtlich ist, wie ich eine einfache where-Klausel spezifizieren würde. Zum Beispiel, wenn ich die letzte Bestellung einer Person finden wollte, kann ich Order.first ([sort: 'orderDateTime', order: 'desc']) nicht einfach tun, da ich keine separate Bestellungstabelle für habe jeder Benutzer im System. – nogridbag

0

Sie können die grails findBy Methoden verwenden, das erste Ergebnis einer Abfrage zurückzukehren.

-> Von der 1.3.7 docs

findBy *

Zweck

dynamische Methode, die die Eigenschaften der Domäne-Klasse verwendet die Schaffung von Grails Abfragemethode Ausdrücke zu ermöglichen, die die erste Rück Ergebnis der Abfrage

-> vom latest docs

findBy * Zweck

dynamische Methode, die die Eigenschaften der Domäne-Klasse verwendet eine Abfrage Rückkehr das Ergebnis erste passende auszuführen.