2015-09-08 5 views
15

EDIT: Lösungen für dieses Problem sind in der zweiten und vierten Antwort zu dieser Frage setMaxResults for Spring-Data-JPA annotation? bereitgestelltnur erste/letzte Element Fetching mit Spring Data JPA und @Query Anmerkung

Ziel: Fetch die größte/kleinste Element für Eigenschaft z, das ein Spring Data JPA-Repository und die Spring Query-Annotation verwendet.

Was ich bisher

@Query("SELECT xelement FROM x xelement ORDER BY xelement.z") 
public List<X> findFirstElement(); 

Problem haben: Diese Abfrage ruft alle Elemente (die nicht wirklich wirksam ist). Wenn ich die EntityManager direcly verwenden würde, könnte ich die Anzahl der Ergebnisse gesetzt

entityManager.setMaxResults(1) 

mit nur das erste Element zu erhalten.

Frage: Wie kann ich die maximale Anzahl von Ergebnissen geben Sie die @Query Anmerkung verwenden?

Idee: Verwenden Sie eine PageRequest der Größe 0 den Weg zu gehen?

Einschränkungen: Ich bin mir der "FindFirstBy ...." Abfrage-Funktion bewusst, aber ich möchte/muss die @Query Annotation verwenden.

+0

Warum gibt Ihre Methode 'List ' zurück, wenn nur ein einzelnes Element zurückgegeben werden soll? Wenn die Abfrage wirklich so einfach ist, können Sie '@ Query' vermeiden und einfach' findFirstOrderByZ() 'verwenden. Andernfalls müssen Sie das Schlüsselwort 'LIMIT' verwenden, um die Anzahl der zurückgegebenen Datensätze einzuschränken: SELECT x FROM xelement x ORDER BY x.z LIMIT 1. – manish

+0

@manish: 1. In Bezug auf die Liste , das war nur flexibel genug für den Fall, dass ich eine beliebige Anzahl von Elementen wechseln würde, aber ja, im Prinzip bist du richtig, die Rückgabe einer Liste ist in diesem Fall Overkill. 2. Bezüglich der "findFirst .." -> siehe Einschränkungen. 3. Sind Sie sicher, dass das Limit-Schlüsselwort in JPQL verfügbar ist? Ich denke, ich muss es überprüfen .... Ich fand auch http://stackoverflow.com/questions/9314078/setmaxresults-for-spring-data-jpa-annotation, die das Problem ziemlich löst. –

+0

Dies wurde durch die zweite und vierte Antwort in [http: // stackoverflow.com/Fragen/9314078/setMaxResults-for-Feder-data-JPA-Annotation] [1] [1]: http://stackoverflow.com/questions/9314078/setmaxresults-for-spring-data -jpa-annotation –

Antwort

0

Versuchen, dies zu tun:

@Query(value = "SELECT xelement FROM x xelement ORDER BY xelement.z LIMIT 1", 
     nativeQuery = true) 
+0

Ich sehe, Sie haben bereits eine Bearbeitung rückgängig gemacht, bei der jemand Ihr Englisch korrigiert hat, aber "Probieren Sie das" ist hier viel besser Englisch als "Versuchen Sie es". (Ich bin eine englische Muttersprachlerin.) Ihre Phrasierung klingt so, als wären Sie sich der korrekten Form sehr unsicher - in diesem Fall sollte das kein Kommentar, sondern eine Antwort sein. –

+1

Ich denke, das ist keine Website zum Überprüfen der englischen Grammatik .... –

4

Sie die Grenze Eigenschaft von SQL nur verwenden können nativeQuery durch Hinzufügen Anmerkung @query. Es gibt jedoch einen anderen und besseren Weg, dies zu tun. Seitenwechselbar Klasse in Ihrem Repository-Methode wird Ihr Problem lösen, ohne Ihre @Query Anmerkung zu berühren:

@Query(value = "SELECT xelement FROM x xelement ORDER BY xelement.z") 
List<X> findFirstElement(Pageable limit); 

die Grenze festzulegen und Offset, sollte die Verwendung dieses Repository-Methode aufrufen, wie folgt:

List<X> xValues = xRepository.findFirstElement(new PageRequest(0, 1)); 

Hier 1 entspricht an die Grenze, die Sie wollen.

1

Die nächste JPA-Abfrage-Syntax, die ich für Ihren Anwendungsfall denken kann, ist findFirstByZIsNotNullOrderByZAsc. Dies sollte die Notwendigkeit, benutzerdefinierte native Abfrage schreiben zu beseitigen.

Verwandte Themen