Spring IncorrectResultSizeDataAccessException用于查询返回Long值? Java的

时间:2017-02-20 13:14:45

标签: java spring jpa spring-data

我已经向现有的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将破坏我的合同并在很多地方需要重构。

如何限制查询始终返回一个值而不是中断?

由于

1 个答案:

答案 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);
  }
}
相关问题