Как использовать знаки процента с LIKE в пользовательском запросе Spring Boot N1QL для использования с базой данных Couchbase - PullRequest
0 голосов
/ 28 апреля 2020

Я хочу передать имя методу и добавить в него знаки процента внутри запроса.

Если запрос равен @Query("...file_name LIKE $1 ..."), а я передаю %dogNames%, он работает отлично. Но каким должен быть запрос, чтобы я мог передать dogNames (нет %), и он работает точно так же?

Я могу сделать это с findByFileNameContains(). Запрос для findByFileNameContains() автоматически сгенерирован для меня и работает так, что я могу передать строку типа "dogNames.txt", и он будет возвращать файлы с именами типа "/bin/dogNames.txt.9348393.tgz" и " /bigdogNames.txt». Поэтому он написал для меня что-то вроде этого: @Query ("#{#n1ql.selectEntity} WHERE file_name LIKE %$1% ") Знаки процента включены в запрос, и я просто передаю строку, которую я хочу, чтобы имя файла содержало.

Как написать сам запрос, который выполняет так же? Я пробовал то, что показано для findByFileNamePatternAndFileDirectory(), и получаю эту ошибку:

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

Класс DAO:

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 %$1% AND  file_dir = $2")
  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$3(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)

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Мне не удалось найти запрос, который будет go в @Query("..."), однако я заставил его работать, используя «механизм построения запросов, встроенный в инфраструктуру репозитория Spring Data» для автоматической генерации запроса для я назвал метод указанным c способом:

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

Вот где я нашел некоторую полезную информацию о том, как назвать методы, чтобы заставить его выполнять требуемый запрос: Spring -Data-Couchbase Docs

И здесь обсуждается SpEL (язык выражения Spring, например: #{#n1ql.filter}), если вам интересно, как это работает: SpEL

0 голосов
/ 28 апреля 2020

LIKE можно делать только на строки. правая часть LIKE должна быть в кавычках. Если это параметр запроса, он не может быть оптимизирован

use Пример:

имя_файла LIKE "xyz%"

...