【发布时间】:2020-03-04 10:39:05
【问题描述】:
只是面对 Spring Data JPA 2.2.0 的奇怪行为。
Product 和 Category 是两个非常简单的实体,具有一对多的关系。请注意,在我的情况下,某些产品可能没有类别。
我做这个查询
@Query("select p, c" +
"from Product p " +
"left join fetch Category c on p.category.id = c.id " +
"where (:categoryId = -1L or c.id = :categoryId) and " +
"(:priceFrom is null or p.price >= :priceFrom) and " +
"(:priceTo is null or p.price <= :priceTo)")
Page<Product> filterProducts(@Param("categoryId") Long categoryId,
@Param("priceFrom") BigDecimal priceFrom,
@Param("priceTo") BigDecimal priceTo,
Pageable pageable);
但是方法调用返回Page<Object[]>而不是Page<Product>。如果我在返回类型中将Page 更改为List,一切都会好起来的。为什么它会这样工作?是否可以改变这种行为?
我使用select p, c 通过一次查询将产品和类别中的所有数据填充到结果产品中。没有cHibernate 做一些额外的查询来获取类别。
【问题讨论】:
-
如果您使用现有的 Spring Data repo 方法,您能否检查是否也会发生这种情况,例如
Page<Product> findAll();? -
也许还发布您的相关实体类...可以帮助
-
可能是重复的...请看一下:stackoverflow.com/questions/6877857/…
-
据我所知,要使用延迟加载字段,它必须具有
optional=false参数。但是Category是可选的。您可以尝试添加EmptyCategory值而不是 null。然后尝试使用join fetch而不是left join fetch
标签: java hibernate pagination spring-data-jpa