我有一个这样的位置模型(呈现了专有模型的等效模拟,省略的自动生成的ID和其他一些字段):
@NodeEntity
class Space: Location() {
@field:Relationship(type = "SUBLOCATED_IN", direction = Relationship.OUTGOING) var subLocation: SubLocation? = null
}
@NodeEntity
abstract class SubLocation: Location() {
@field:Relationship(type = "LOCATED_IN", direction = Relationship.OUTGOING) var locatedIn: Building? = null
}
@NodeEntity
class Building: Location()
@NodeEntity
abstract class Location {
var name: String? = null
var city: String? = null
var country: String? = null
}
SubLocation
是一些Office
,Desk
,Room
等一些不同具体类的抽象,这些实现无关紧要。使用Location
,例如在Person
类中:
@NodeEntity
class Person(
var name: String,
@JsonIgnore @Relationship(type = "WORKS_IN", direction = Relationship.OUTGOING)
var location: Location? = null
)
当我有一个像Person
-> Room
(SubLocation
)-> Building
之类的子图时,所有内容都像一个超级按钮。我正在通过Neo4jRepository
接口进行查询,它会产生一个Person
( location
-> Person
)的SubLocation
对象以及正确设置的locatedIn
( SubLocation
-> Building
):
interface PersonRepository: Neo4jRepository<Person, Long> {
@Depth(5) // exaggerated for test purposes
fun findAllByName(name: String): List<Person>
}
当我有一个像
这样的子图时,问题就暴露出来了 Person
-> Space
-> Room
(SubLocation
)-> Building
,当我使用相同的存储库方法查询时,仅获得映射到对象的第一级关系。 Person
对象已将location
设置为Space
,但是Space
将subLocation
设置为null
。
我正在使用spring-data-neo4j -> 5.1.6.RELEASE
和neo4j-ogm-core -> 3.1.8
和neo4j:3.5.3
的最新版本。
TL; DR:
spring-data-neo4j
不会自动将具有抽象类类型的@Relationship
注释字段映射到具体对象,而是分配了null
。
答案 0 :(得分:0)
显然,它可以通过自定义@Query
来解决:
interface PersonRepository: Neo4jRepository<Person, Long> {
@Query(""""
MATCH g=(:Person)-[*1..3]->(:Building)
RETURN g
"""")
fun findAllByName(name: String): List<Person>
}