findByPropertyAndReleation没有给我期望的实体

时间:2019-06-24 13:07:35

标签: spring-boot kotlin spring-data spring-data-neo4j

我正在使用具有spring-boot-starter-data-neo4j依赖项和独立功能的spring boot应用程序(2.1.6.RELEASE)将历史足球(或足球,如果您来自美国)数据导入Neo4j数据库,本地运行的3.5.6 Neo4j数据库服务器。

但是由于某种原因,尽管数据库中存在该关系,但通过简单属性和附加的引用实体搜索实体是行不通的。

这是模型的一部分,目前让我头疼:

@NodeEntity(label = "Season")
open class Season(
    @Id
    @GeneratedValue
    var id: Long? = null,

    @Index(unique = true)
    var name: String,

    var seasonNumber: Long,

    @Relationship(type = "IN_LEAGUE", direction = Relationship.OUTGOING)
    var league: League?,

    var start: LocalDate,

    var end: LocalDate
)

@NodeEntity(label = "League")
open class League(
    @Id
    @GeneratedValue
    var id: Long? = null,

    @Index(unique = true)
    var name: String,

    @Relationship(type = "BELONGS_TO", direction = Relationship.OUTGOING)
    var country: Country?
)

(我省去了Country类,因为我很确定这不是问题的一部分)

要允许多次运行导入,我想检查数据库中是否已经存在相应的实体,并且仅导入较新的实体。所以我添加了以下方法SeasonRepository:

open class SeasonRepository : CrudRepository<Season, Long> {
    fun findBySeasonNumberAndLeague(number: Long, league: League): Season?
}

但是它给了我null的结果,而不是连续运行的现有实体,因此我的数据库中出现了重复项。

我希望spring-data-neo4j将传递的League减少为其ID,然后生成一个看起来像这样的查询:

MATCH (s:Season)-[:IN_LEAGUE]->(l:League) WHERE id(l) = {leagueId} AND s.seasonNumber = {seasonNumber} WITH s MATCH (s)-[r]->(o) RETURN s,r,o

但是当我打开neo4j包的更好的日志记录时,我会在日志文件中看到以下输出:

MATCH (n:`Season`) WHERE n.`seasonNumber` = { `seasonNumber_0` } AND n.`league` = { `league_1` } WITH n RETURN n,[ [ (n)-[r_i1:`IN_LEAGUE`]->(l1:`League`) | [ r_i1, l1 ] ] ], ID(n) with params {league_1={id=30228, name=1. Bundesliga, country={id=29773, name=Deutschland}}, seasonNumber_0=1}

因此,出于某种原因,spring-data似乎认为,联盟属性是简单/原始属性,而不是完整的版本,需要id(n.联盟{{1} } league_1 = {)。

我只能通过传递联赛ID并使用}注释提供自定义查询来使其工作,但我实际上认为,它可以与spring-data-neo4j一起使用

任何帮助表示赞赏。让我知道您是否需要更多详细信息。

1 个答案:

答案 0 :(得分:1)

Spring Data Neo4j目前不支持将对象作为参数。可以查询相关实体/节点上的属性,例如findBySeasonNumberAndLeagueName,如果这是合适的解决方案。