Что такое альтернатива LIMIT в JPQL?

Я работаю с выполнением запросов PostgreSQL в JPQL.

Это пример собственного psql-запроса, который отлично работает,

SELECT * FROM students ORDER BY id DESC LIMIT 1;

Тот же запрос в JPQL не работает,

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

Students getLastStudentDetails();

похоже, что предложение LIMIT не работает в JPQL.

Согласно документации JPA, мы можем использовать setMaxResults/setFirstResult. Может ли кто-нибудь сказать мне, как я могу использовать это в моем предыдущем запросе?

Ответ 1

Вы используете JPQL, который не поддерживает ограничение результатов, как это. При использовании нативного JPQL вы должны использовать setMaxResults для ограничения результатов.

Однако вы используете Spring Data JPA, что делает его довольно простым. Смотрите здесь в справочном руководстве о том, как ограничить результаты на основе запроса. В вашем случае следующий метод find будет делать именно то, что вы хотите.

findFirstByOrderById();

Вы также можете использовать аргумент Pageable своем запросе вместо предложения LIMIT.

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

Затем в своем коде вызова сделайте что-то вроде этого (как описано здесь в справочном руководстве).

getLastStudentDetails(new PageRequest(0,1));

Оба должны дать один и тот же результат, не прибегая к простому SQL.

Ответ 2

Как указано в комментариях, JPQL не поддерживает ключевое слово LIMIT.

Это можно использовать с помощью setMaxResults, но если вы хотите только один элемент, используйте getSingleResult - он выдает исключение, если элемент не найден.

Итак, ваш запрос будет выглядеть примерно так:

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

Если вы хотите установить конкретное начальное смещение, используйте query.setFirstResult(initPosition); тоже

Ответ 3

Хардкорное разбиение на страницы (new PageRequest(0, 1)) для получения выборки только одной записи.

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

Вы должны передать new PageRequest(0, 1) чтобы получить записи и из списка получить первую запись.

Ответ 4

Вы можете использовать что-то вроде этого:

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

Ответ 5

Здравствуйте, за выборку одной строки и использование LIMIT в jpql, мы можем сказать jpql, является ли он собственным запросом.

(используя - nativeQuery = true)

Ниже использование

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