微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql – Spring Data返回List而不是List

我有关于 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无法强制转换为java.lang.Long

JPA实现 – Hibernate.
作为DB我使用Postgresql,unit.oid字段在DB层上有BigInt类型.
获取整个单元的情况下它被映射到Long,但是使用自定义查询作为“select distinct …”时出现了错误并且它被映射到BigInteger.

所以,我的问题是:这种奇怪行为的原因是什么?
如何以优雅的方式解决/解决它?

这是Spring数据JPA的一个问题.
如果在DB中数据类型定义为BigInteger,并且在JPA查询中我们尝试获取为Long,则它不会给出任何错误,但它在Long数据类型中将值设置为BigInteger.

解决方案:

>使用BigInteger作为返回类型

@Query(value =“从单元中选择distinct(oid)”,nativeQuery = true)
列表与LT; BigInteger的>测试方法();

然后将变量设置如下.
Long variable = bigIntegerValue.longValue();
>使用String作为返回类型并转换为Long

@Query(value =“从单元中选择distinct(oid)”,nativeQuery = true)
列表与LT;字符串>测试方法();

然后将值设置为

Long variable = Long.valueOf(stringValue);
>将DB列类型更改为Integer / Number.
>从实体对象中获取值.

Long variable = dpConfigData.getoid();

其中dpConfigData是Entity的对象(DpConfigData.class)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐