满足此JPQL要求

时间:2014-07-14 08:44:55

标签: jpa jpql spring-data-jpa

要求:一个字符串的内容存在于另一个字符串中。这仅测试整个单词,但允许多字查询。例如,givenName:Jane的查询将匹配“Jane”和“Jane Ann”的givenName值的用户,但不会匹配“Janet”。 givenName:Mary Ann的多字查询将匹配“Mary Ann Evans”和“Sarah Mary Ann”的值,但不匹配“Ann Mary”。

这是我到目前为止所拥有的。 我有SiteRepository扩展JpaRepository接口,它包含以下方法。

@Query("SELECT s from Site s WHERE s.name LIKE :givenName")
public List<Site> findByName(@Param("givenName") String givenName);

现在,用户假设将String值传递给下面的方法(例如“:Jane”或“:Mary Ann”)。

public List<Site> findByName(String givenName) //Where Site is an entity with a name field.

在上面的方法中,我基本上检查了参数giveName的第一个字符,看它是否是“:”,如果是,我将子串givenName切掉冒号并连接以下字符。

return siteRepository.findByName("%" + givenName.substring(1, givenName.length()) + "%"  
                + " AND NOT LIKE _" + givenName.substring(1, givenName.length()) + "_");

所以,如果我打电话,findByName(":Jane") 我应该得到以下JPQL查询:SELECT s from Site s WHERE s.name LIKE %Jane% AND NOT LIKE _Jane_

然而,这不起作用。任何帮助将不胜感激,并提前感谢。

2 个答案:

答案 0 :(得分:0)

我不是jpql的专家,所以我在这里只写我的假设,这些假设不一定正确,但我还是试着帮助op。

如果我的答案有误,那么请在答案上留言,让我知道。

我认为这个答案不值得投票,因为我已经明确表示我的答案不一定正确,如果不正确,我会将其删除。

这是我的想法,在不知道技术细节的情况下被描述为对问题的评论:

  

您应该编写一个查询,检查是否所有单词都是   现在和一个单词的第一个索引是在最后一个索引之前   下一个字。

LOCATE(searchString, candidateString [, startIndex])

searchString开始搜索candidateStringstartIndex的位置,从1开始索引。想法是编写一个查询,检查该位置是否返回0以外值startIndex,取决于前一个字符串的startIndex。 (Source)如果所有字符串都符合条件,则记录应包含在结果中。

答案 1 :(得分:0)

我找到了解决方案。这似乎适用于我目前测试的案例。

&#34; SELECT s FROM Site s WHERE s.name NOT LIKE&#39; Jane _&#39; AND s.name NOT LIKE&#39; _Jane&#39; AND s.name NOT LIKE&#39; Jane &#39; AND s.name LIKE&#39;%Jane%&#39; &#34;