Eli*_*ana 5 java orm jpa eclipselink jpa-2.1
我正在使用JPA 2.1(Eclipselink供应商)@SqlResultSetMapping将sql查询映射到none实体POJO,当sql结果不为空但my表为空时,它可以工作
我的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.
Run Code Online (Sandbox Code Playgroud)
我期望空结果应该由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
)
Run Code Online (Sandbox Code Playgroud)
Eclipselink 上似乎存在这个未解决的错误。我正在使用 2.6.3,我也面临同样的问题 - https://bugs.eclipse.org/bugs/show_bug.cgi?id=484276
| 归档时间: |
|
| 查看次数: |
962 次 |
| 最近记录: |