2017-02-20 41 views
0

我添加了一个新的查询方法,以现有的JPA存储库,其从OrderItem的实体,以便检索一个id为Long类型:对于返回Long值的查询,Spring IncorrectResultSizeDataAccessException? Java的

@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:结果返回多个元素;嵌套的例外是javax.persistence.NonUniqueResultException:结果在 com.sun.proxy返回多个元素

$ Proxy993.findLatestModificationIdForOrderItem(来源不明)

咨询这太问题后:setMaxResults for Spring-Data-JPA annotation?

该解决方案是将方法返回类型更改为List,但htis将破坏我的合同并需要在很多地方重构。

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

感谢

+3

我要离开的查询和合同。更改接口的实现以返回按时间排序的List,并返回最新的一个(列表中的第一个或最后一个)。 – duffymo

回答

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); 
    } 
}