3

카운트 사이퍼 쿼리가 사용되는 곳에서 코드를 테스트하여 문제를 발견했습니다. 테스트가 내장 데이터베이스 (EmbeddedDriver)에 대해 실행되는 경우 결과 유형 내의 반환 값은 Long (또는 정수, 기억하지 못합니다.)이며 동일한 테스트가 원격 데이터베이스 (HttpDriver)에 대해 반환 된 값을 Result 형은 Integer (또는 long;)입니다.스프링 데이터 Neo4j (4.2.0M1) 카운트 Cypher 쿼리 리턴 타입이 내장 된 DB와 다른 원격 태그

이것은 단위 테스트 케이스에서 Integer를 반환하고 코드가 원격 데이터베이스에 대해 "프로덕션 모드"로 사용될 때 ClassCastException을 갖을 것이라고 생각하는 코드를 구현할 수 없다는 것을 의미합니다.

현재 해결 방법은 제대로 반환 값을 캐스팅하기 위해 instanceof를 사용하고 있지만, 그것은 정말 확대됨에없는 예쁜 ... 여기

는 이러한 쿼리 중 하나의 예입니다

Object result = neo4jSession.query("MATCH (n) RETURN count(n) as result", 
        ...).iterator().next().get("result"); 

Long value = result instanceof Long ? (Long) result : new Long((Integer) result); 

가 그게 버그 야?

답변

1

여러 가지 형태로 한 번 질문이 제기됩니다 (예 : this one 또는 that one 참조).

그것은, Number보다 더 구체적 유형을 가정하지 않는 것이 좋습니다 그러면 당신은 할 수 없다 :

long value = ((Number) result).longValue(); 

아니 instanceof, 어떤 객체 생성합니다.

+0

나는 그 해결 방법에 동의 하나 사실은 그 두 가지 타입의 Db가 같은 자바 타입을 반환하지 않는다는 것을 더 많이 알게된다 ... – Oizo

+0

그것이 길거나 int인지 여부는 특히 유형이 분명하지 않은 neo 나머지 api. ogm은 사용자 정의 조회의 숫자가 나타내는 것을 이해하지 못하므로 숫자를 특정 데이터 유형으로 항상 변환하려고하지 않습니다. 프랭크 (Frank)가 설명한 것처럼 숫자로 처리하는 것이 좋습니다. – Luanne