有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPQL中的LIMIT子句是什么?

我正在使用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();

似乎限制子句在JPQL中不起作用

根据JPA文档,我们可以使用setMaxResults/setFirstResult,有人能告诉我如何在我的上述查询中使用它吗


共 (6) 个答案

  1. # 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)来获取记录,并从列表中传递来获取第一条记录

  2. # 2 楼答案

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

    org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: LIMIT near line 1

    但别担心,还有一种替代方法,可以使用以下步骤在HQL生成的查询中使用limit关键字

    Sort.by(sortBy).descending() // fetch the records in descending order

    pageSize = 1 // fetch the first record from the descending order result set.

    请参阅以下服务类别

    服务:

    @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();
    }
    

    存储库界面应实现分页和排序存储库

    存储库:

    public interface StudentRepository extends JpaRepository<Student,Long>, PagingAndSortingRepository<Student,Long>{
    
        @Query("select student from Student student")
        Slice<Student> findLastStudent(Pageable paging);
    }
    

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

  3. # 3 楼答案

    不能在HQL中使用Limit,因为Limit依赖于数据库供应商,所以Hibernate不允许通过HQL查询

    可以实现的一种方法是使用子查询:

    @Query("FROM Students st WHERE st.id = (SELECT max(s.id) FROM Students s)")
    Students getLastStudentDetails();
    
  4. # 4 楼答案

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

    (使用-nativeQuery=true)

    下面是用法

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

    如评论中所述,JPQL不支持LIMIT关键字

    您可以使用setMaxResults来实现这一点,但是如果您想要的只是一个项目,那么就使用getSingleResult——如果找不到任何项目,它会引发异常

    因此,您的查询将类似于:

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

    如果要设置特定的起始偏移量,请使用^{;也是

  6. # 6 楼答案

    您使用的是JPQL,它不支持这样限制结果。当使用原生JPQL时,应该使用setMaxResults来限制结果

    不过,您使用的是Spring数据JPA,这基本上使它非常容易实现。请参阅参考指南中的here,了解如何基于查询限制结果。在您的情况下,下面的find方法将完全满足您的要求

    findFirstByOrderById();
    

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

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

    然后在调用代码中执行类似的操作(如参考指南中的here所述)

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

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