Как сделать запрос на основе коллекции поисковых текстов - PullRequest
1 голос
/ 12 апреля 2019

У меня есть функция поиска, которая может обрабатывать несколько текстов поиска.Теперь мне нравится запрашивать в моей базе данных элементы, которые содержат хотя бы один из текстов поиска.

Для одного текста поиска я использую следующее:

import org.springframework.data.jpa.repository.Query;
@Query("SELECT m FROM Material m WHERE m.productName LIKE %:searchText%")

Для коллекции поискатексты, которые я пробовал:

@Query("SELECT m FROM Material m WHERE m.productName IN (:searchTexts)")

Проблема, с которой я сталкиваюсь, заключается в том, что теперь только точное имя продукта соответствует запросу.Но я также ищу частичные совпадения.Что-то вроде:

@Query("SELECT m FROM Material m WHERE m.productName IN (%:searchTexts%)")

Можно ли использовать JPQL или мне нужно использовать QueryDSL?

1 Ответ

0 голосов
/ 15 апреля 2019

После прочтения возможного дублирования и многих других потоков я наткнулся на функцию «RLIKE» в MySQL.Прежде всего, это функция MySQL, и, насколько я знаю, не является частью стандартного JPQL или HQL.Чтобы использовать его, я создал собственный MySQLDialect:

public class CustomMySqlDialect extends MySQLDialect {
  public CustomMySqlDialect() {
    super();

    registerFunction("REGEX_LIKE", new SQLFunctionTemplate(BOOLEAN, "?1 RLIKE (?2)"));
  }
}

И это @Query:

@Query("SELECT m FROM Material m WHERE function('REGEX_LIKE', m.productName, :searchTexts) = 1 "
List<Material> findByProductName(@Param("searchTexts") String searchTexts);

В качестве параметра можно использовать строки поиска текста, объединенныетрубы.

List<String> searchTexts = Arrays.asList("abc", "xyz");
String joinedSearchTexts = String.join("|", searchTexts);
List<Material> searchResult = findByProductName(joinedSearchTexts);
...