JPQL中的LIMIT子句替代是什么?

时间:2017-06-15 11:01:18

标签: java jpa spring-boot spring-data-jpa jpql

我正在使用JPQL中的PostgreSQL查询。

这是一个原生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,任何人都可以告诉我如何在上述查询中使用它?

7 个答案:

答案 0 :(得分:35)

您正在使用不支持限制结果的JPQL。使用本机JPQL时,您应使用setMaxResults来限制结果。

但是,您使用的是Spring Data JPA,这基本上很容易实现。请参阅参考指南中的here,了解如何根据查询限制结果。在您的情况下,find方法可以完全按照您的要求进行操作。

findFirstByOrderById();

您还可以在查询中使用Pageable参数,而不是LIMIT子句。

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

然后在您的调用代码中执行类似的操作(参考指南中的here解释)。

getLastStudentDetails(new PageRequest(0,1));

两者都应该产生相同的结果,而不需要求助于纯SQL。

答案 1 :(得分:9)

正如评论中所述,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);太

答案 2 :(得分:2)

您不能在Limit中使用HQL,因为Limit取决于数据库供应商,因此Hibernate不允许通过HQL查询。

一种实现方式是使用子查询:

@Query("FROM Students st WHERE st.id = (SELECT max(s.id) FROM Students s)")
Students getLastStudentDetails();

答案 3 :(得分:1)

您可以使用以下内容:

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

答案 4 :(得分:1)

对分页(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)才能获取记录,并从列表中获取第一条记录。

答案 5 :(得分:1)

JPQL不允许在HQL生成的查询中添加 limit 关键字。您将收到以下异常。

org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌: LIMIT在第1行附近

但是请不要担心,可以通过以下步骤在HQL生成的查询中使用limit关键字。

Sort.by(sortBy).descending()//以降序获取记录

pageSize = 1 //从降序结果集中获取第一条记录。

请参考以下服务类别

服务:

@Autowired
StudentRepository repository; 

public List<Student> getLastStudentDetails(Integer pageNo, Integer pageSize, String sortBy)
{
    Integer pageNo = 0;
    Integer pageSize = 1;
    String sortBy = "id";
    Pageable paging = PageRequest.of(pageNo, pageSize, Sort.by(sortBy).descending());

    Slice<Student> pagedResult = repository.findLastStudent(paging);

    return pagedResult.getContent();
}

您的存储库界面应实现 PagingAndSortingRepository

存储库:

public interface StudentRepository extends JpaRepository<Student,Long>, PagingAndSortingRepository<Student,Long>{

    @Query("select student from Student student")
    Slice<Student> findLastStudent(Pageable paging);
}

这将为查询添加limit关键字,您可以在控制台中看到它。希望这会有所帮助。

答案 6 :(得分:0)

您好,您可以获取jpql中的单行并使用LIMIT,我们可以告诉jpql它是否是本机查询。

(使用-nativeQuery = true)

以下是用途

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