Ошибка приведения репозитория Spring JPA при использовании JPQL - PullRequest
0 голосов
/ 28 июня 2018

У меня объявлено хранилище JPA PagingAndSorting. Я использую аннотацию @Query.

Я получаю исключение при вызове метода get () для Необязательного объекта из метода findById (id) хранилища.

Странная вещь, это происходит только тогда, когда я использую JPQL.

Код работает, если мой запрос является родным:

    @Override
public BatchDto findById(String id) {
    Optional<Batch> findResult =  this.batchRepository.findById(id);
    if (!findResult.isPresent()) return null;
    Batch entity = findResult.get();  **<-------- Cast Exception Here**
    BatchDto dto = this.mapper.toDto(entity, BatchDto.class);
    List<BatchTransaction> transactions = entity.getTransactions();
    dto.setTransactionDtos(mapper.toListDto(transactions, TransactionDto.class));
    return dto;
}

Проверка объекта findResult с точкой останова - я вижу:

Optional[net.domain.data.batch@4b8bb6f] 

когда у меня есть nativeQuery = true в аннотации @Query.

@Query(value = Sql.FindBatchById, nativeQuery = true) 

Вот используемый запрос:

SELECT DISTINCT(B.batchNumber), COUNT(B.batchNumber) as TransactionCount FROM BATCH B WHERE B.batchReferenceNumber = :id GROUP BY B.batchNumber

Однако, если я изменю его на JPQL и удалю атрибут nativeQuery = true - findResult будет

Optional[[Ljava.lang.Object;@76e04327].  

и я получаю ClassCastException:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to net.domain.data.batch

Итак, нижняя строка - это работает, если указать nativeQuery = true, и не работает, когда я пытаюсь использовать JPQL.

Я бы предпочел не указывать nativeQuery, поскольку мы в конечном итоге перенесем эту базу данных в Oracle.

1 Ответ

0 голосов
/ 02 июля 2018

Прежде всего, приведенный ниже запрос не возвращает ни одного экземпляра Batch. Поскольку есть агрегатные функции distinct и count, запрос вернет агрегаты List. Чтобы иметь возможность читать эту статистику, вы можете добавить соответствующий метод в batchRepository. Как то так:

@Query("SELECT DISTINCT(B.batchNumber) as dist, COUNT(B.batchNumber) as cnt FROM BATCH B GROUP BY B.batchNumber")
  List<Map<Long, Long>> findStatistics();

, а затем перебрать список.

UPD

Если параметр id точно гарантирует, что будет возвращать одну запись, вы можете изменить тип возврата на Map

@Query("SELECT DISTINCT(B.batchNumber) as dist, COUNT(B.batchNumber) as cnt FROM BATCH B WHERE B.batchReferenceNumber = :id GROUP BY B.batchNumber")
      Map<Long, Long> findStatisticsById(@Param("id") Long id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...