考虑到Spring Boot,带有Spring-Data-neo4j-4的neo4j环境我想删除它并在删除失败时收到错误消息。
我的问题是因为Repository.delete()返回void我没有ideia如果删除修改了任何东西。
第一个问题:有没有办法让最后一个查询受影响的行?例如在plsql中我可以做SQL%ROWCOUNT
所以无论如何,我尝试了以下代码:
@Spy
在上面的代码中,我查询数据库以在删除它之前检查该值是否存在。 第二个问题:你推荐任何不同的方法吗?
所以现在,只是为了增加一些复杂性,我有一个集群数据库,而db1只能创建,更新和删除,而db2和db3只能读取(这是由集群套接字确保的)。 db2和db3将从复制过程接收来自db1的数据。 对于我到目前为止看到的复制可能需要多达90秒,这意味着最多90秒数据库将具有不同的状态。
再看上面的代码:
public void deletesomething(Long somethingId) {
somethingRepository.delete(getExistingsomething(somethingId).getId());
}
private something getExistingsomething(Long somethingId, int depth) {
return Optional.ofNullable(somethingRepository.findOne(somethingId, depth))
.orElseThrow(() -> new somethingNotFoundException(somethingId));
}
在调试中意味着:
public void deletesomething(Long somethingId) {
somethingRepository.delete(getExistingsomething(somethingId).getId());
}
所以如果复制没有在db2中插入该代码,则此代码将抛出异常。 第二个问题是:如果没有更改这些套接字,我有什么方法可以删除并给出正确的响应吗?
答案 0 :(得分:1)
Spring Data Neo4j目前不支持此功能,如果您愿意,请打开功能请求。
与此同时,也许最简单的解决方法是降低OGM抽象级别。
org.neo4j.ogm.session.Session
Session
示例: (例如在Kotlin,现有)
fun deleteProfilesByColor(color : String)
{
var query = """
MATCH (n:Profile {color: {color}})
DETACH DELETE n;
"""
val params = mutableMapOf(
"color" to color
)
val result = session.query(query, params)
val statistics = result.queryStatistics() //Use these!
}