javamysqljpaspring-data-jpajpql

What is the LIMIT clause alternative in JPQL?


I'm working with PostgreSQL query implementing in JPQL.

This is a sample native psql query which works fine,

SELECT * FROM students ORDER BY id DESC LIMIT 1;

The same query in JPQL doesnt work,

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

Students getLastStudentDetails();

seems like LIMIT clause doesn't work in JPQL.

According to JPA documentation we can use setMaxResults/setFirstResult, Can anyone tell me how can I use that in my above query?


Solution

  • You are using JPQL which doesn't support limiting results like this. When using native JPQL you should use setMaxResults to limit the results.

    However, you are using Spring Data JPA which makes it pretty easy. See here in the reference guide on how to limit results based on a query. In your case, the following find method would do exactly what you want.

    findFirstByOrderById();
    

    You could also use a Pageable argument with your query instead of a LIMIT clause.

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

    Then in your calling code do something like this (as explained here in the reference guide).

    getLastStudentDetails(PageRequest.of(0,1));
    

    Both should yield the same result, without resorting to plain SQL.