2017-12-11 1 views
3

원시 쿼리를 사용하여 bigint 목록을 얻은 다음 반복 할 계획입니다. 나는 위와 같이 긴 데이터 유형을 사용하는 경우bigint postgres datatytpe를 Java long으로 캐스트합니다.

@Query(value="SELECT bigint_field FROM complex_innerquery", nativeQuery=true) 
Collection<Long> getAllBigIntFieldValues(); 

, 그것은

java.math.BigInteger의이 java.lang.Long의

캐스트 할 수없는

는 것 같다 다음과 같은 오류가 발생합니다 JPA와 마찬가지로 기본적으로 bigint를 데이터베이스에서 BigInteger로 변환합니다.

분명히 BigInteger는 Long과 비교할 때 거대한 데이터 유형입니다. 저장하는 동안 내 필드는 정의 된 엔티티에서 Long 유형이므로, BigInteger에서 Long 값으로 변환하는 동안 데이터를 잃을 가능성은 없지만 다른 방법으로 BigInteger 데이터 유형을 제거 할 수 있습니다 ? 특히, 나는 getAllBigIntFieldValues 메서드를 호출하여 BigInteger를 명시 적으로 LongValue로 변환하는 메서드를 원하지 않습니다.

+3

이유가 * 왜 * 발생했는지에 대한 [이 질문] (https://stackoverflow.com/q/27429422/1079354)은 몇 가지 통찰력을 제공합니다. – Makoto

답변

1

스프링 데이터 JPA 메카닉으로는이를 수행 할 수 없습니다.

소스 코드의 관련 부분은 그것은 ConversionService을 가지고 있으며, 필요한 유형의 쿼리 결과를 변환하는 데 사용하려고 JpaQueryExecution

입니다 : 불행하게도

if (void.class.equals(requiredType) || requiredType.isAssignableFrom(result.getClass())) { 
    return result; 
} 

return CONVERSION_SERVICE.canConvert(result.getClass(), requiredType) // 
     ? CONVERSION_SERVICE.convert(result, requiredType) // 
     : result; 

에 어떤 메커니즘이 없습니다 변환기를이 변환 서비스에 추가하십시오.

SQL의 기능을 사용하여 선택 항목의 값을 기본 JDBC 드라이버에서 Long으로 제공 할 항목으로 변환 할 수 있습니다.

예를 들어 그것은 단지 당신이 제목에 Postgres를 언급 언급 UNSIGNED BIGINT and get a Long

에 결과를 변환 할 수있는 MySQL 수 있어야한다. BIGSERIAL might be an option there.