Spring Data JPA:添加分页后投影被破坏

时间:2018-05-17 12:08:40

标签: java spring hibernate spring-boot spring-data-jpa

我有一个使用投影的查询,只要返回类型为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 count(me)SELECT语句之间插入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列[SELECT DISTINCT new   com.mycompany.dto.MyDto(me.property1,me.property2,...)选择   伯爵(我)来自com.mycompany.MyEntiry me ...]       在org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:74)       在org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:91)       在org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:291)       在org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:186)       在org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:141)       在org.hibernate.engine.query.spi.HQLQueryPlan。(HQLQueryPlan.java:115)       在org.hibernate.engine.query.spi.HQLQueryPlan。(HQLQueryPlan.java:77)       在org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153)       在org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:553)       在org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:662)       ... 88更多

问题:如何让它发挥作用?是Spring Data bug吗?

注意:

  • 我添加的查询过于简单,我的真实查询实际上从不同的表中收集了不同的值,我无法在没有投影的情况下实现它
  • 我使用的是Spring Boot 1.5.8.RELEASE

1 个答案:

答案 0 :(得分:0)

尝试使用&#39; native&#39; Spring Data JPA projections

这应该运作良好:

public interface MyProjection {
    String getProperty1();
    //...
}

Page<MyProjection> getDistinctAllBy(Pageable pageable);

但是,如果您的查询加入了许多表格,则无法轻松使用分页(例如:12

<强>已更新

尝试将参数countQuery添加到@Query注释:

@Query(value = "select ...", countQuery = "select count(me) from MyEntiry me")
Page<MyDto> findEntities(Pageable pageable);