Spring数据Neo4j(4.2.0M1)计数Cypher查询返回类型与嵌入式数据库不同,而与远程数据库不同

Spring数据Neo4j(4.2.0M1)计数Cypher查询返回类型与嵌入式数据库不同,而与远程数据库不同,neo4j,cypher,spring-data-neo4j,spring-data-neo4j-4,embedded-database,Neo4j,Cypher,Spring Data Neo4j,Spring Data Neo4j 4,Embedded Database,我们通过测试使用计数密码查询的代码发现了一个问题。如果测试针对嵌入式数据库(EmbeddedDriver)运行,则结果类型中的返回值为Long(或整数,我不记得了),而当同一测试针对远程数据库(HttpDriver)运行时,结果类型中的返回值为整数(或Long;) 这意味着,当代码在“生产模式”中针对远程数据库使用时,我们不能认为它将在单元测试用例中返回一个整数,并且有一个ClassCastException来实现我们的代码 当前的解决方法是使用instanceof来正确转换返回值,但它确实没有

我们通过测试使用计数密码查询的代码发现了一个问题。如果测试针对嵌入式数据库(EmbeddedDriver)运行,则结果类型中的返回值为Long(或整数,我不记得了),而当同一测试针对远程数据库(HttpDriver)运行时,结果类型中的返回值为整数(或Long;)

这意味着,当代码在“生产模式”中针对远程数据库使用时,我们不能认为它将在单元测试用例中返回一个整数,并且有一个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);

这是一个bug吗?

这个问题每隔一段时间就会以各种形式出现(请参见或举例)

最好不要假设类型比
数字
更具体,然后您可以执行以下操作:

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

没有
instanceof
,没有对象创建。

我确实同意这种解决方法,但事实上更需要知道的是,这两种类型的Db没有返回相同的java类型,这是否是一个错误……它是长类型还是int类型取决于该值,特别是在neo rest api上,该类型并不明显。ogm并不总是尝试将数字转换为特定的数据类型,因为它不了解自定义查询中的数字代表什么。建议按照Frank所述将其视为数字