如何在自定义 Spring 引导 N1QL 查询中使用带有 LIKE 的百分号以与 Couchbase 数据库一起使用

How to use percent signs with LIKE in a custom Spring Boot N1QL query for use with a Couchbase DB

我想将名称传递给该方法并让它在查询中为我添加百分号。

如果查询是 @Query("...file_name LIKE ...") 并且我传入 %dogNames% 则它可以完美运行。 但是查询必须是什么才能让我传入 dogNames(没有 %'s)并且它的工作原理完全一样?

我可以用 findByFileNameContains() 做到这一点。 findByFileNameContains() 的查询是为我自动生成的并且可以工作,这样我就可以传入一个像 "dogNames.txt" 这样的字符串,它将 return 文件的名称像 "/bin/dogNames.txt .9348393.tgz”和“/bigdogNames.txt”。所以它为我写了这样的东西: @Query ("#{#n1ql.selectEntity} WHERE file_name LIKE %% ") 百分号包含在查询中,我只是传入我希望文件名包含的字符串。

如何自己编写执行相同方式的查询?我尝试了 findByFileNamePatternAndFileDirectory() 显示的内容,但出现此错误:

{"msg":"syntax error - at %!(NOVERB)","code":3000} 

DAO class:

import com.mystuff.File;
import java.util.List;
import org.springframework.data.couchbase.core.query.Query;
import org.springframework.data.couchbase.repository.CouchbasePagingAndSortingRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface FileDao
    extends CouchbasePagingAndSortingRepository<File, String> {


  List<File> findByFileNameContains(String fileName);


  @Query(
      "#{#n1ql.selectEntity} WHERE #{#n1ql.filter} AND file_name LIKE %% AND  file_dir = ")
  List<File> findByFileNamePatternAndFileDirectory(
      String fileName, String fileDir);
}

更完整的错误日志:

{"msg":"syntax error - at %!(NOVERB)","code":3000}
    at org.springframework.data.couchbase.core.CouchbaseTemplate.findByN1QL(CouchbaseTemplate.java:470)
    at org.springframework.data.couchbase.repository.query.AbstractN1qlBasedQuery.executeCollection(AbstractN1qlBasedQuery.java:157)
    at org.springframework.data.couchbase.repository.query.AbstractN1qlBasedQuery.executeDependingOnType(AbstractN1qlBasedQuery.java:132)
    at org.springframework.data.couchbase.repository.query.AbstractN1qlBasedQuery.execute(AbstractN1qlBasedQuery.java:107)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:605)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$invoke(RepositoryFactorySupport.java:595)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:595)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.data.couchbase.repository.support.ViewPostProcessor$ViewInterceptor.invoke(ViewPostProcessor.java:87)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)

LIKE 只能对字符串进行。 LIKE 的右侧必须用引号引起来。如果是查询参数,则可能未优化

使用像这样的东西

file_name 喜欢 "xyz%"

我无法找到将进入 @Query("...") 的查询,但是我确实通过使用 "query builder mechanism built into Spring Data repository infrastructure" 通过命名来为我自动生成查询来让它工作具体方法:

List<File> findByFileNameContainsAndFileDirectory(
      String fileName, String fileDir);
}

我在这里找到了一些关于如何命名方法以使其执行所需查询的有用信息:Spring-Data-Couchbase Docs

这里讨论了 SpEL(Spring 表达式语言,例如:#{#n1ql.filter})如果你好奇它是如何工作的:SpEL

应该是

"#{#n1ql.selectEntity} WHERE #{#n1ql.filter} AND file_name LIKE  || '%' AND  file_dir = ")