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

Posted

技术标签:

【中文标题】Spring Data Neo4j (4.2.0M1) 计数 Cypher 查询返回类型不同于嵌入式数据库而不是远程数据库【英文标题】:Spring Data Neo4j (4.2.0M1) count Cypher query return type different from embedded DB than for remote one 【发布时间】:2016-09-26 12:17:22 【问题描述】:

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

这意味着我们无法实现我们的代码,认为它会在我们的单元测试用例中返回一个 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,没有对象创建。

【讨论】:

我确实同意这种解决方法,但事实更多的是要知道这两种类型的 Db 是否没有返回相同的 java 类型是否是一个错误...... 它是 long 还是 int 取决于值,尤其是在类型不明显的 neo rest api 上。 ogm 不会尝试始终将数字转换为特定数据类型,因为它不了解自定义查询中的这些数字代表什么。推荐将其视为 Frank 描述的 Number 方法

以上是关于Spring Data Neo4j (4.2.0M1) 计数 Cypher 查询返回类型不同于嵌入式数据库而不是远程数据库的主要内容,如果未能解决你的问题,请参考以下文章

Neo4j 和 Spring-data Map 查询结果到 Jackson JsonNode

spring boot 2.0 neo4j 使用

IgnoreCase Finder 不适用于 Spring Data Rest 和 Neo4J

Neo4j:不知道如何将图形映射到 Spring Data bean

Spring Data Neo4j 多态关联出现嵌入

如何在 Grails 2.4.2 项目中集成 Spring Data Neo4j 和 Mongodb