2017-02-20 30 views
0

Я добавил новый метод запроса к существующему хранилище JPA который извлекает идентификатор как тип Long от OrderItem субъекта, как так: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 (Unknown Source)

После ознакомления с этим так вопрос:. setMaxResults for Spring-Data-JPA annotation?

Это решение заключалось в том, чтобы изменить тип возвращаемого метода в список, но htis нарушит мой контракт и потребует рефакторинга во многих местах.

Как я могу ограничить запрос, чтобы всегда возвращать одно значение и не прерывать?

Благодаря

+3

Я бы оставить запрос и договор. Измените реализацию интерфейса, чтобы вернуть список, упорядоченный по времени, и вернуть последний (первый или последний в списке). – duffymo

ответ

1

Пожалуйста Try Пример:

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