如何在sql查询中使用LIMIT?

2022-09-01 16:34:53

不知何故,我无法在sql查询中使用限定符:LIMITSpring-data-jpa

@Query("SELECT p from Person p WHERE p.company.id = :id ORDER BY p.name DESC LIMIT 3")

这是怎么回事?

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: Limit near line 1, column 146
    at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91)
    at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:304)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:203)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:158)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:126)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:88)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:190)
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:301)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1800)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:328)
    ... 48 more

答案 1

LIMIT不是 JPQL 的一部分。当前发行版(截至撰写本文时的 1.6.0.RELEASE)中可用的机制是分页:

interface PersonRepository extends Repository<Person, Long> {

  @Query("...")
  List<Person> findLimited(..., Pageable pageable);
}

然后可以按如下方式使用它:

repository.findLimited(..., new PageRequest(0, 10));

这将返回注释中定义的查询的前十个结果。@Query

Spring Data JPA的当前主分支已经包含一个新功能,允许您按如下方式重写上面的查询:

interface PersonRepository extends Repository<Person, Long> {

  List<Person> findTop3ByCompanyOrderByName(Company company);
}

从版本 1.7.0.M1(快照已有的功能)开始,查询派生机制将理解并在 subject 子句中限制返回的结果数。TopFirst

更新为已弃用,您需要改用new PageRequestPageRequest.of(0, 10)


答案 2

我的回答可能很晚了,但是如果我能帮助其他人,你可以像这样使用nativeQuery:

@Query(value="SELECT * from person p WHERE p.company_id = :id ORDER BY p.name DESC LIMIT 3", nativeQuery = true)

推荐