3

Мы обнаружили проблему, протестировав наш код, в котором используется запрос cypher count. Если тест выполняется против встроенной базы данных (EmbeddedDriver), возвращаемое значение в типе Result является Long (или Integer, я не помню), и когда тот же тест выполняется с удаленной базой данных (HttpDriver), возвращаемое значение внутри Тип результата - Integer (или long;).Spring Data Neo4j (4.2.0M1) count Тип запроса запроса Cypher отличается от встроенного DB, чем для удаленного

Это означает, что мы не можем реализовать наш код, думая, что он вернет целое число в наших модульных тестовых случаях и имеет исключение 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 не возвращают один и тот же тип java ... – Oizo

+0

Является ли long или int, зависит от значения, особенно за neo rest api, где тип не очевиден. Ogm не пытается всегда преобразовывать числа в определенный тип данных, так как не понимает, что представляют собой эти числа в пользовательских запросах. Рассмотрение его как числа, как описано Фрэнком, является рекомендуемым способом – Luanne