我正在使用JPA 2.1(Eclipselink供应商)@SqlResultSetMapping将sql查询映射到无实体POJO,它在sql结果不为空时工作,但是当我的表为空时我的POJO的构造失败,例外情况如下:2016-05-30 11:44:17,154 [tp520017379-230] ...
我正在使用JPA 2.1(Eclipselink供应商)@SqlResultSetMapping将sql查询映射到无实体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自动处理空结果吗?或任何其他建议?
Code Sample:
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
)
解决方法:
您需要指定如下类型:
@ColumnResult(name =“na_agg”,type =“Double.class”)
沃梦达教程
本文标题为:java – JPA @SqlResultSetMapping无法处理要映射到空POJO的空sql结果 – 而是抛出异常
基础教程推荐
猜你喜欢
- Alibaba Fastjson之超好用的JOSN解析库 2023-06-23
- 使用复杂的布尔值来限制MySQL端或Java端的ResultSet是否更快? 2023-11-05
- Linux Centos安装jdk 之前照着网上安装了好多次 结果都是javac编译失败,出现javac :command not found 2023-09-01
- SpringBoot接口数据加解密实战记录 2023-02-28
- 关于MyBatis中映射对象关系的举例 2023-01-24
- Java实现订单超时未支付自动取消的8种方法总结 2023-04-18
- Java使用NIO优化IO实现文件上传下载功能 2023-03-21
- 详解Java中二分法的基本思路和实现 2023-04-23
- springboot vue测试平台开发调通前后端环境实现登录 2022-11-16
- 关于maven的用法和几个常用的命令 2023-06-30