JPA @SqlResultSetMapping не может обрабатывать пустой результат sql для сопоставления с пустым POJO - вместо этого выдается исключение

Я использую JPA 2.1 (поставщик Eclipselink) @SqlResultSetMapping для сопоставления запроса sql ни с одним Entity POJO, он работает, когда результат sql не пуст, но когда моя таблица пуста пустая таблица с нулями

конструкция моего POJO не выполняется, за исключением:

 2016-05-30 11:44:17,154 [tp520017379-230] ERROR - Exception [EclipseLink-6177] (Eclipse Persistence Services - 2.6.2.v20151217-774c696): org.eclipse.persistence.exceptions.QueryException
    Exception Description: The column result [st_agg] was not found in the results of the query.
    Query: ResultSetMappingQuery(name="nodeStatusAggQuery" sql="select max(status) as st_agg, max(clock_accuracy_health) as cac_agg, max(clock_analysis_health) as can_agg, max(ptp_net_analysis_health) as na_agg from sync_node where ncd_id = ? and type =?")
    javax.persistence.PersistenceException: Exception [EclipseLink-6177] (Eclipse Persistence Services - 2.6.2.v20151217-774c696): org.eclipse.persistence.exceptions.QueryException
    Exception Description: The column result [st_agg] was not found in the results of the query.

Я ожидаю, что пустой результат должен автоматически обрабатываться JPA, например, путем вызова конструктора по умолчанию моего POJO. я нашел обходной путь для решения проблемы, перехватив исключение, но мой Вопрос могу ли я заставить JPA автоматически обрабатывать пустые результаты?? или любые другие предложения?

Пример кода:

  public static SyncNodeStatusAggregation getMaxSeverStatusAndHealth(int ncdId, SyncProtocolType type){
    try {
      EntityManager em = ...
      Query aggregateQuery = em.createNamedQuery(SyncNodeDBImpl.NODE_STATUS_AGG_QUERY);
      aggregateQuery.setParameter(1, ncdId);
      aggregateQuery.setParameter(2, type.ordinal());
      return (SyncNodeStatusAggregation) aggregateQuery.getSingleResult();
      //javax.persistence.PersistenceException can be thrown when result is empty, JPA will not be able to map the result to object, thus we handle it be catching the exception
    } catch (PersistenceException e) {
      return new SyncNodeStatusAggregation(SyncNodeStatus.Ok, SyncHealthIndication.na, SyncHealthIndication.na, SyncHealthIndication.na );
    }
  }



@SqlResultSetMapping(
        name = SyncNodeDBImpl.RESULT_MAPPING_NAME,
        classes = {
                @ConstructorResult(
                        targetClass = SyncNodeStatusAggregation.class,
                        columns = {
                                @ColumnResult(name = "st_agg"),
                                @ColumnResult(name = "cac_agg"),
                                @ColumnResult(name = "can_agg"),
                                @ColumnResult(name = "na_agg"),
                        }
                )
        }
)
@NamedNativeQuery(
        name = SyncNodeDBImpl.NODE_STATUS_AGG_QUERY,
        query = "select max(status) as st_agg, max(clock_accuracy_health) as cac_agg, max(clock_analysis_health) as can_agg, max(ptp_net_analysis_health) as na_agg from sync_node where ncd_id = ?1 and type =?2",
        resultSetMapping =SyncNodeDBImpl.RESULT_MAPPING_NAME
)

person Elia Rohana    schedule 30.05.2016    source источник
comment
Вы нашли какое-нибудь решение?   -  person vels4j    schedule 21.06.2016


Ответы (2)


Вам нужно указать тип следующим образом:

@ColumnResult(name = "na_agg",type="Double.class")

person Georgi    schedule 30.08.2016

Кажется, в Eclipselink есть эта открытая ошибка. Я использую 2.6.3 и тоже сталкиваюсь с тем же - https://bugs.eclipse.org/bugs/show_bug.cgi?id=484276

person paulo.bing    schedule 16.06.2016