2015-11-29 91 views
0

尝试使用SDN 4并发现尽管某些查询在密码浏览器中有效,但它们似乎无法在我的存储库中工作。例如,当我输入查询时:Spring Neo4j 4(SDN)通配符查询方法不起作用

MATCH (p:Publication) WHERE p.name =~'(?i)e.*' RETURN p; 

在密码浏览器中,它返回预期结果。但是,将我的存储库定义为:

public interface PublicationRepo extends GraphRepository<Publication> { 
    Publication findByName(String name); 
    @Query(value="MATCH (p:Publication) WHERE p.name=~'(?i){0}.*' RETURN p") 
    Iterable<Publication> findByNameLikeIgnoreCase(String name); 
} 

它返回零结果。

项目设置是否正常工作,因为我可以从其他的自定义查询方法的数据,但通配符匹配不工作

另外,我觉得很奇怪的是,标准的Spring数据JPA查询方法也没有工作(例如'findByNameContaining'等)。有没有其他人遇到这个问题,或者我做错了什么。我见过的所有例子都非常基本。

+0

使用像将在下一版本中 – Luanne

回答

1

这不是一个弹簧数据neo4j问题。您在字符串中使用该参数,在该字符串中未对其进行评估。

将其更改为此,即使用参数连接正则表达式的字符串。

MATCH (p:Publication) WHERE p.name=~ ('(?i)' + {0} + '.*') RETURN p 

public interface PublicationRepo extends GraphRepository<Publication> { 
    Publication findByName(String name); 
    @Query("MATCH (p:Publication) WHERE p.name=~ ('(?i)'+{0}+'.*') RETURN p") 
    Iterable<Publication> findByNameLikeIgnoreCase(String name); 
} 
+0

这奏效了......非常感谢,@迈克尔 - 饥饿的一个发现者支持 –

0

不知道是否有更好的方法来解决这个问题,但基本上我将通配符标记与搜索字符串连接起来,然后将它传递给查找器方法。代码是这样的:

public interface PublicationRepo extends GraphRepository<Publication> { 
    Publication findByName(String name); 
    @Query(value="MATCH (p:Publication)-[r:HAS_PUBLICATION]-(i:Issue) WHERE p.name=~{0} RETURN p, r, i") 
    Iterable<Publication> findByNameLikeIgnoreCase(String name); 
} 

这现在工作,但我不是真正喜欢呼叫者需要按摩查询参数。这就是生活。