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(功能已经可用的快照)查询推导机制将理解Top和First主语从句中限制返回结果的数量.
更新
为new PageRequest过时,你需要使用PageRequest.of(0, 10)替代
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)
| 归档时间: |
|
| 查看次数: |
15739 次 |
| 最近记录: |