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
IgnoreCase Finder 不适用于 Spring Data Rest 和 Neo4J