java - org.postgresql.util.PSQLException:BigDecimal 类型的值错误:使用 JPA 的 {1}
问题描述
当我尝试使用以下命令启动查询时CeateNativeQuery
:
String q = "select status.code as status, array_agg(reference.id) as ref from reference_history
inner join reference on reference.id = reference_history.reference_id
inner join process_info on reference_history.process_info_id = process_info.id
inner join status on process_info.status_id = status.id
where reference.code = 'ref123456'
and status.code in ('INPROGRESS', 'RESOLVED')
and start_date <= '2020-12-06'
and (end_date >= '2020-12-03' or end_date is null)
group by status";
List<Object[]> result = query.unwrap(org.hibernate.query.NativeQuery.class)
.addScalar("ref", StandardBasicTypes.BIG_INTEGER)
.getResultList();
我收到了这个错误:
org.postgresql.util.PSQLException: Bad value for type BigDecimal : {1}
at org.postgresql.jdbc.PgResultSet.toBigDecimal(PgResultSet.java:2910)
at org.postgresql.jdbc.PgResultSet.toBigDecimal(PgResultSet.java:2919)
at org.postgresql.jdbc.PgResultSet.getNumeric(PgResultSet.java:2378)
at org.postgresql.jdbc.PgResultSet.getBigDecimal(PgResultSet.java:2332)
at org.postgresql.jdbc.PgResultSet.getBigDecimal(PgResultSet.java:390)
at org.postgresql.jdbc.PgResultSet.getBigDecimal(PgResultSet.java:394)
at com.zaxxer.hikari.pool.HikariProxyResultSet.getBigDecimal(HikariProxyResultSet.java)
at org.hibernate.type.descriptor.sql.DecimalTypeDescriptor$2.doExtract(DecimalTypeDescriptor.java:63)
at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253)
at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:249)
at org.hibernate.loader.custom.ScalarResultColumnProcessor.extract(ScalarResultColumnProcessor.java:54)
at org.hibernate.loader.custom.ResultRowProcessor.buildResultRow(ResultRowProcessor.java:83)
at org.hibernate.loader.custom.ResultRowProcessor.buildResultRow(ResultRowProcessor.java:60)
at org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow(CustomLoader.java:412)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:775)
at org.hibernate.loader.Loader.getRowsFromResultSet(Loader.java:1044)
at org.hibernate.loader.Loader.processResultSet(Loader.java:995)
at org.hibernate.loader.Loader.doQuery(Loader.java:964)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:350)
at org.hibernate.loader.Loader.doList(Loader.java:2887)
at org.hibernate.loader.Loader.doList(Loader.java:2869)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2701)
at org.hibernate.loader.Loader.list(Loader.java:2696)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:338)
at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2142)
at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1163)
at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:173)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1533)
at org.hibernate.query.Query.getResultList(Query.java:165)
我该如何解决?
解决方案
因此,由于 PostgreSQLARRAY_AGG
函数返回数组,您不能简单地将其转换为BigDecimal
. 为此,您应该编写自己的休眠自定义基本类型,或者您可以使用休眠类型库。
例如,您可以添加此依赖项:
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>2.10.1</version>
</dependency>
如果您使用休眠 5.4、5.3 或 5.2,然后按以下方式编写查询:
import org.hibernate.type.StringType;
import com.vladmihalcea.hibernate.type.array.LongArrayType;
List<Object[]> result = query.unwrap(org.hibernate.query.NativeQuery.class)
.addScalar("status", StringType.INSTANCE)
.addScalar("ref", LongArrayType.INSTANCE)
.getResultList();
如果您决定编写自己的休眠类型,这个问题可能会很有用。
推荐阅读
- neo4j - 使用 Neo4j 导入数据
- ios - 使用 MDCTabBarViewController 时的空白 ViewControllers - Swift 4.2
- mysql - 从外部主机(Rackspace、Digital Ocean 等)到 AWS / RDS / MySQL 的连接缓慢
- angular - 如何在 NativeScript 代码共享项目中使用 Appium?
- c - 尝试释放指针时的段错误
- html - 结构化数据和 HTML 表格
- r - 计算分组数据中点之间的欧几里得距离
- javascript - 捆绑一个需要 webpack 的 typescript 项目
- scala - 火花加入改变equalTo函数
- javascript - 动态加载大型 jQuery 可选择/可排序元素