【发布时间】:2026-02-01 01:05:03
【问题描述】:
我在 spring-data 上实现了 DAO:
public interface TestDataRepository extends CrudRepository<DpConfigData, Long> {
@Query(value = "select distinct(oid) from unit", nativeQuery = true)
List<Long> testMethod();
}
和单元测试来测试提到的 DAO:
@Test
public void test(){
List<Long> testData = dpConfigDataEntityDataRepository.testMethod();
for (Long oid:testData){
System.out.print(oid);
}
}
运行测试给出奇怪的结果 - 运行时的 List<Long> testData 由 BigInteger 实例填充,而不是由 Long 填充。结果我得到 ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long
JPA 实现 - 休眠。
作为数据库,我使用 PostgreSQL,unit.oid 字段在数据库层上具有 BigInt 类型。
在获取整个单元的情况下,它被映射到 Long,但是自定义查询为“选择不同的 ...”时出现问题,它被映射到 BigInteger。
那么,我的问题是:这种奇怪行为的原因是什么? 如何以优雅的方式解决/解决它?
【问题讨论】:
-
这需要是nativeQuery吗?如果不是,请删除
, nativeQuery = true看看是否有帮助。 -
@RobertNiestroj 该代码仅作为示例。实际上,“select distinct ...”更为复杂,很少有两个数据集的“select with joins”和“union”。所以,我需要使用原生查询。
-
Postgresql 中的 BigInt 映射到 BigInteger,因为它没有符号 - 你能改变你的 JPA 对象吗?
-
@farrellmr 但是在获取整个单元的情况下,oid 会正确映射到 Long。为什么?
-
对于 nativequery 与 JPA 映射,它必须是不同的路径。一个有趣的测试是运行“select distinct(oid) from unit where oid = 1”,这样它会返回 1 个条目并将签名更改为 Long testMethod(),看看是否有效。顺便说一句,我看看您是否可以更改 Query 中的返回类型,或定义结果映射但看不到如何
标签: postgresql hibernate-mapping spring-data-jpa