wake-up-neo.com

Was ist die LIMIT-Klauselalternative in JPQL?

Ich arbeite mit der PostgreSQL-Abfrage, die in JPQL implementiert wird.

Dies ist eine systemeigene psql-Abfrage, die gut funktioniert.

SELECT * FROM students ORDER BY id DESC LIMIT 1;

Die gleiche Abfrage in JPQL funktioniert nicht.

@Query("SELECT s FROM Students s ORDER BY s.id DESC LIMIT 1")

Students getLastStudentDetails();

scheint, dass die LIMIT-Klausel in JPQL nicht funktioniert.

Laut JPA-Dokumentation können wir setMaxResults/setFirstResult verwenden. Kann mir jemand sagen, wie ich das in meiner obigen Anfrage verwenden kann?

20
Madhu

Sie verwenden JPQL, das keine einschränkenden Ergebnisse wie dieses unterstützt. Bei Verwendung von nativem JPQL sollten Sie setMaxResults verwenden, um die Ergebnisse einzuschränken.

Sie verwenden jedoch Spring Data JPA, was es im Grunde recht einfach macht. Siehe hier in der Referenzanleitung, wie Sie Ergebnisse basierend auf einer Abfrage begrenzen können. In Ihrem Fall würde die Suchmethode genau das tun, was Sie möchten. 

findFirstByOrderById();

Anstelle einer Pageable-Klausel könnten Sie auch ein LIMIT-Argument für Ihre Abfrage verwenden.

@Query("SELECT s FROM Students s ORDER BY s.id DESC")
List<Students> getLastStudentDetails(Pageable pageable);

Dann machen Sie in Ihrem Anrufcode so etwas (wie hier in der Referenzanleitung erklärt). 

getLastStudentDetails(new PageRequest(0,1));

Beide sollten dasselbe Ergebnis liefern, ohne auf reines SQL zurückgreifen zu müssen. 

27
M. Deinum

Wie in den Kommentaren angegeben, unterstützt JPQL das Schlüsselwort LIMIT nicht.

Sie können dies mit der setMaxResults erreichen, aber wenn Sie nur ein einzelnes Element wünschen, verwenden Sie die getSingleResult - es wird eine Ausnahme ausgelöst, wenn kein Element gefunden wird.

Ihre Anfrage wäre also etwa so:

TypedQuery<Student> query = entityManager.createQuery("SELECT s FROM Students s ORDER BY s.id DESC", Student.class);    
query.setMaxResults(1);

Wenn Sie einen bestimmten Startversatz festlegen möchten, verwenden Sie query.setFirstResult(initPosition); auch

9
dazito

Sie können so etwas verwenden:

 @Repository
 public interface ICustomerMasterRepository extends CrudRepository<CustomerMaster, String> 
 {
    @Query(value = "SELECT max(c.customer_id) FROM CustomerMaster c ")
    public String getMaxId();
 }
1
Rajib Das Gupta

Härten Sie die Paginierung (new PageRequest(0, 1)) fest, um nur einen Datensatz abzurufen.

    @QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value = "true") })
    @Query("select * from a_table order by a_table_column desc")
    List<String> getStringValue(Pageable pageable);

sie müssen new PageRequest(0, 1) übergeben, um Datensätze abzurufen, und aus der Liste den ersten Datensatz abrufen.

1
tk_

Hallo für das Abrufen einer einzelnen Zeile und die Verwendung von LIMIT in jpql können wir dem jpql mitteilen, ob es sich um eine native Abfrage handelt.

(using - nativeQuery = true)  

Unten ist die Verwendung

@Query("SELECT s FROM Students s ORDER BY s.id DESC LIMIT 1", nativeQuery=true)
Students getLastStudentDetails();
0
Manish Joshi