2017-11-27 21 views
0

데이터베이스 쿼리 (최대 절전 모드)로 채워진 목록 ID가 있습니다. 데이터베이스 은 PSQL입니다. ID 열은 bigint 유형입니다. 이제 IDS 목록이Hibernate 쿼리를 사용하여 채워진 목록을 반복 할 때 ClassCastException이 발생했습니다.

List<Long> ids = getIds();//getIds returns List<Long> 

같은 예외없이 채워집니다하지만

for (Long id : ids) 

하여 IDS 목록의 항목을 통해 루프하려고 할 때 예외를 얻을

java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long 

값은 206131954입니다. 왜 목록에 값을 추가 할 수 있는지 모르겠지만 나중에 목록을 살펴볼 때 오류가 있습니다.

public List<Long> getIds() { 
    List<Long> externalIds = new ArrayList<Long>(); 
    List<Person> persons = repository.getPeople(); 
    for (Person person : persons) { 
     List<Long> ids = repository.getIdentifications(person); 
     if (ids.size() > 0) { 
      externalIds.addAll(ids); 
     } 
    } 
    return externalIds; 
} 

public List<Long> getIdentifications() { 
    String q = "select person_id from relevantpeople"; 
    Query query = entityManager.createNativeQuery(q); 
    return (List<Long>) query.getResultList(); 
} 
+0

우리는 정말'getIds의 몸을 사용할 수 있습니다()'방식 –

+0

이 가장 가능성이 필드 매핑 문제 - '목록 는'내부적으로 제네릭이 아닌'List', 그래서 코드는 컴파일하지만 휴식 런타임에. – dasblinkenlight

+0

'getIds' 메소드 내에 쿼리를 보여 주시겠습니까? 이게 너의 방법이야? –

답변

0

사용 List<BigInteger> 대신 List<Long>

BigInteger를 긴보다 더 큰 정수 번호를 보유 할 수 있습니다.

BigInteger는 (2^32)^Integer.MAX_VALUE를 유지합니다.

long hold (2^63) -1;

+0

하지만 목록의 값 (이 경우 하나의 항목 만 있음)은 206131954이므로 Long 범위에 쉽게 맞습니다. 범위 차이 때문에 BigInteger로 바꾸기 만하면됩니다. 내 ID는 Long이 보유 할 수있는 것보다 확실히 높지 않습니다. – krltos

+1

쿼리의 현재 커서 값과 관련이 없습니다. 중요한 것은 테이블의 열의 유형입니다. 'Person' 테이블에서 읽으려는 컬럼이'BigInt'로 정의되어 있다면, 이것은 처리해야하는 타입입니다. – GuilhermeFGL