it-swarm.com.ru

Какова альтернатива предложения 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. Может кто-нибудь сказать мне, как я могу использовать это в моем запросе выше?

20
Madhu

Вы используете 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. 

27
M. Deinum

Как указано в комментариях, 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); тоже

9
dazito

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

 @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

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

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

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

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