【问题标题】:Spring Neo4j 4 (SDN) Wildcard Query methods not workingSpring Neo4j 4(SDN)通配符查询方法不起作用
【发布时间】:2015-11-29 10:31:04
【问题描述】:

试用 SDN 4 并发现尽管某些查询在密码浏览器中有效,但它们似乎在我的存储库中无效。例如,当我输入查询时:

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 Data JPA 查询方法也不起作用(例如“findByNameContaining”等)。有没有其他人遇到这个或者我做错了什么。我看到的所有例子都是非常基础的。

【问题讨论】:

  • 下一个版本中将提供对使用 Like 的查找器的支持

标签: java spring neo4j sdn


【解决方案1】:

这不是 spring data neo4j 问题。您在字符串中使用参数,但不会对其进行评估。

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

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);
}

【讨论】:

    【解决方案2】:

    不确定是否有更好的方法来解决这个问题,但基本上我在将通配符标记与搜索字符串传递给 finder 方法之前将其连接起来。代码如下:

    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);
    }
    

    这现在可以工作了,但我并不喜欢调用者需要按摩查询参数。生活吧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多