我有一个使用投影的查询,只要返回类型是List,它就能正常工作,但是它在添加分页后停止工作。
以下是工作代码:
@Query("SELECT DISTINCT \n" +
" new com.mycompany.dto.MyDto(me.property1, me.property2, ...) \n" +
"FROM MyEntiry me...")
List<MyDto> findEntities();我需要扩展它以添加分页,所以我将它更改为:
@Query("SELECT DISTINCT \n" +
" new com.mycompany.dto.MyDto(me.property1, me.property2, ...) \n" +
"FROM MyEntiry me...")
Page<MyDto> findEntities(Pageable pageable);一旦我这样做了,上下文就会失败,因为在解析时它会在SELECT和FROM语句之间插入FROM,以便查询成为无效的
SELECT DISTINCT
new com.mycompany.dto.MyDto(me.property1, me.property2, ...)
select count(me) FROM com.mycompany.MyEntiry me ...除以下例外情况外,上下文将失败:
原因: org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:选择靠近第3行,第1列选择不同的新com.mycompany.dto.MyDto(me.property1,me.property2,.)选择计数( me )从com.mycompany.MyEntiry me.在org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74) at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:91) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:291) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:186) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:141)在org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:115) at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:77) at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153) at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:553) at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:662) 88
问题:如何使它工作?是Spring数据错误吗?
注:
发布于 2018-05-17 12:32:08
尝试使用“本机”Spring 预测。
这应能很好地运作:
public interface MyProjection {
String getProperty1();
//...
}
Page<MyProjection> getDistinctAllBy(Pageable pageable);但是,如果您的查询连接了许多表,那么在使用分页时会遇到一些痛苦(例如:1、2)。
更新
尝试将参数countQuery添加到@Query注释中:
@Query(value = "select ...", countQuery = "select count(me) from MyEntiry me")
Page<MyDto> findEntities(Pageable pageable);https://stackoverflow.com/questions/50391119
复制相似问题