我已经向现有的JPA存储库添加了一个新的查询方法,该存储库从OrderItem实体中检索id为Long
的类型,如下所示:
@Transactional("order_item")
public interface OrderItemRepository extends PagingAndSortingRepository<OrderItem, Integer> {
...other queries
/**
* Retrieves the latest modification Id of order item entity
*
* @param orderItemId id
* @return modificationId | null if order item is not a print product
*/
@Query("select pri.modificationId from OrderItem as oi"
+ " join oi.physicalItems as phys"
+ " join phys.printItem as pri"
+ " where oi.id = :orderItemId"
+ " order by pri.modificationId desc")
Long findLatestmodificationIdForOrderItem(@Param("orderItemId") Integer orderItemId);
}
查询主要有效,但有时会在日志中出现此错误:
org.springframework.dao.IncorrectResultSizeDataAccessException:result返回多个元素;嵌套异常是javax.persistence.NonUniqueResultException:result返回多个元素
在 com.sun.proxy。$ Proxy993.findLatestModificationIdForOrderItem(Unknown Source)
在咨询了这个问题后:setMaxResults for Spring-Data-JPA annotation?
该解决方案是将方法返回类型更改为List,但htis将破坏我的合同并在很多地方需要重构。
如何限制查询始终返回一个值而不是中断?
由于
答案 0 :(得分:1)
请尝试示例:
@Transactional("order_item")
public interface OrderItemRepository extends PagingAndSortingRepository<OrderItem, Integer> {
@Query("select pri.modificationId from OrderItem as oi"
+ " join oi.physicalItems as phys"
+ " join phys.printItem as pri"
+ " where oi.id = :orderItemId"
+ " order by pri.modificationId desc")
List<Long> findLatestmodificationIdForOrderItemQuery(@Param("orderItemId") Integer orderItemId);
default Long findLatestmodificationIdForOrderItem(Integer orderItemId) {
List<Long> result = this.findLatestmodificationIdForOrderItemQuery(orderItemId);
return result.get(0);
}
}