Как выбрать переменное количество одинаковых строк в одном поле с запросом JPA? - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь сделать подобный запрос весной, используя запрос JPA, чтобы найти переменный набор текстов (например, запрос ИЛИ) в том же поле.

На языке SQL:

SELECT * FROM A WHERE text LIKE '%A%' OR text LIKE '%B%' OR text  LIKE '%C%'.... (Variable number)

В JPA это может быть похоже на это (это не настоящий код, его основная идея ожидаемой работы):

@Query("SELECT t FROM table t WHERE t.text LIKE :setOfTerms")
    Page<Example> findTweetsNotParsed(@Param("setOfTerms") Set<String> likeQuery, Pageable pageable);

Есть ли какая-либо техника или методология для этого с запросами JPA?

РЕДАКТИРОВАТЬ: я редактировал вопрос из-за ошибки в аналогичном запросе. Я пишу И, но я хотел поставить ИЛИ.

1 Ответ

0 голосов
/ 27 июня 2018

, nativeQuery = true. В MySQL вам, вероятно, потребуется обработать набор терминов, прежде чем он будет передан в запрос, чтобы вы могли сгенерировать что-то вроде

... text LIKE '%A%B%C%

Таким образом, ваш пример кода может стать:

Page<Example> findTweetsNotParsed(Set<String> likeTerms, Pageable pageable) {
   return executeTweetsNotParsed(String.join("%", likeTerms),pageable)
}

@Query("SELECT t FROM table t WHERE t.text LIKE :setOfTerms")
    Page<Example> executeTweetsNotParsedQuery(@Param("setOfTerms")String likeQuery, Pageable pageable);

Для случая ИЛИ вам нужно использовать REGEXP. Что-то вроде:

Page<Example> findTweetsNotParsed(Set<String> likeTerms, Pageable pageable) {
       String regex = ".*"+String.join(".*|.*", likeTerms)+".*";
       return executeTweetsNotParsed(regex, pageable)
    }

@Query(value = "SELECT t FROM table t WHERE t.text REGEXP (:setOfTerms)", nativeQuery=true)
    Page<Example> executeTweetsNotParsedQuery(@Param("setOfTerms")String likeQuery, Pageable pageable);

Я не проверял регулярное выражение, но если он чистый, он должен быть примерно таким, чтобы вы получили запрос типа

... text REGEXP '.*A.*|.*B.*|.*C.*"

Возможно, вам придется создать код регулярного выражения для ваших конкретных потребностей.

Кроме того, вы можете добиться того же в Postgres, используя оператор SIMILAR TO.

...