要求:一个字符串的内容存在于另一个字符串中。这仅测试整个单词,但允许多字查询。例如,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_
然而,这不起作用。任何帮助将不胜感激,并提前感谢。
答案 0 :(得分:0)
我不是jpql的专家,所以我在这里只写我的假设,这些假设不一定正确,但我还是试着帮助op。
如果我的答案有误,那么请在答案上留言,让我知道。
我认为这个答案不值得投票,因为我已经明确表示我的答案不一定正确,如果不正确,我会将其删除。
这是我的想法,在不知道技术细节的情况下被描述为对问题的评论:
您应该编写一个查询,检查是否所有单词都是 现在和一个单词的第一个索引是在最后一个索引之前 下一个字。
LOCATE(searchString, candidateString [, startIndex])
从searchString
开始搜索candidateString
中startIndex
的位置,从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;