如何在 sql 查询中在 spring 中使用 LIMIT?

新手上路,请多包涵

不知何故,我无法在使用 LIMIT 的 sql 查询中使用 Spring-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

原文由 membersound 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

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 的当前 master 分支已经包含一个新功能,允许您按如下方式重写上述查询:

 interface PersonRepository extends Repository<Person, Long> {

  List<Person> findTop3ByCompanyOrderByName(Company company);
}

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

更新new PageRequest 已弃用你需要使用 PageRequest.of(0, 10) 代替

原文由 Oliver Drotbohm 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

原文由 Sofiane 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题