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

mem*_*und 16 java spring spring-data-jpa

不知怎的,我不能LIMIT在sql查询中使用限定符Spring-data-jpa:

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

这有什么不对?

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
Run Code Online (Sandbox Code Playgroud)

Oli*_*ohm 38

LIMIT不属于JPQL.当前版本中可用的机制(截至撰写本文时为1.6.0.RELEASE)是分页:

interface PersonRepository extends Repository<Person, Long> {

  @Query("...")
  List<Person> findLimited(..., Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)

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

repository.findLimited(..., new PageRequest(0, 10));
Run Code Online (Sandbox Code Playgroud)

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

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

interface PersonRepository extends Repository<Person, Long> {

  List<Person> findTop3ByCompanyOrderByName(Company company);
}
Run Code Online (Sandbox Code Playgroud)

随着版本1.7.0.M1(功能已经可用快照)查询推导机制将理解TopFirst主语从句中限制返回结果的数量.

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

  • 如果我需要使用@Query 怎么办,因为现有的派生机制还不够,但我仍然想限制结果的数量?将 TOP 或 LIMIT 放在查询中并不像其他人所说的那样工作并且将 TOP 放在方法名称中将不起作用,因为在使用 Query 时禁用了派生机制,我还应该使用分页方法吗? (2认同)

Sof*_*ane 14

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

@Query(value="SELECT p from (replace with the person table name in DB) p WHERE p.company.id = :id ORDER BY p.name DESC LIMIT 3", nativeQuery = true)
Run Code Online (Sandbox Code Playgroud)

  • 这非常适合我的 Spring Boot 2.3.6 项目。谢谢你! (2认同)