2017-03-01 25 views
0

使用SDN 4.2,我试图用其他存储库使用的通用方法来定义基础知识库。这样做时,似乎生成的查询将使用通用类型作为节点标签,而不是将实际节点实体类名称用于标签。SDN的基础知识库不查询正确的节点标签

public interface BaseGraphRepository<T extends IdNode> extends GraphRepository<T> { 
    T findOneById(@Param("id") String id); 
} 

现在,让我们说,我有

@Repository 
public interface InstrumentRepository extends BaseGraphRepository<Instrument> { 
} 

当查询InstrumentRepository,生成的查询是

MATCH (n:`IdNode`) WHERE n.`id` = { `id_0` } WITH n MATCH p=(n)-[*0..1]-(m) RETURN p, ID(n) 

我本来期望的是,节点标签将是“仪器”,而不是“IdNode”。

我试图用一些规划环境地政司来修复它自己,但似乎SDN不支持的语法如下:

public interface BaseGraphRepository<T extends IdNode> extends GraphRepository<T> { 
    @Query("MATCH (n:#{#entityName}) WHERE n.id = {id} RETURN n") 
    T findOneById(@Param("id") String id); 
} 

任何想法如何,节点标签可以正确地在当前查询案件?

+0

这看起来像SDN4中的一个错误。似乎工作正常与收集返回类型,但不与T.你应该在这里报告https://jira.spring.io/browse/DATAGRAPH/ –

+0

你有没有尝试使用主索引与'Neo4jRepository '? http://docs.spring.io/spring-data/neo4j/docs/4.2.x/reference/html/#_usage – digx1

+0

谢谢@ digx1,在这种情况下使用主索引。我只是删除了findOneById()方法,而是调用通常的findOne(String id)。完美的作品。 –

回答

0

至于暂时还可以重新定义子库中的方法的变通方法(这无疑违背了BaseGraphRepository的目的,但正如我所说,这仅仅是错误解决方法):

public interface InstrumentRepository extends BaseGraphRepository<Instrument> { 
    Intrument findOneById(String id); 
} 
+0

是的,这正是我在此期间所做的,但正如你所说,它打败了基类的目的。 –