我有一个使用投影的查询,只要返回类型为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吗?
注意:
答案 0 :(得分:0)
尝试使用&#39; native&#39; Spring Data JPA projections。
这应该运作良好:
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);