#postgresql #scala #playframework #slick
Вопрос:
Существует простая сущность базы данных:
case class Foo(id: Option[UUID], keywords: Seq[String])
Я хочу реализовать функцию поиска, которая возвращает все сущности типа Foo
, у которых есть хотя бы одно ключевое слово, содержащее строку поиска.
Я использую Слик и попробовал это:
def searchKeywords(txt: String): Future[Seq[Foo]] = { val action = Foos.filter(p =gt; p.keywords.any like s"%$txt%").result db.run(action) }
Этот фрагмент кода компилируется, но при выполнении я получаю эту ошибку SQL:
PSQLException: ERROR: syntax error at or near "any"
Сгенерированная инструкция sql выглядит следующим образом:
select "id", "title", "tagline", "logo", "short_desc", "keywords", "initial_condition", "work_process", "end_result", "ts", "lm", "v" from "projects" where any("keywords") like '%foo%'
И это не работает с postgresql. (Я использую v12)
Схема таблицы выглядит следующим образом:
CREATE TABLE foos ( id UUID NOT NULL PRIMARY KEY, keywords varchar[] NOT NULL );
Как я могу выполнить поиск в списке строк с помощью like
оператора?
Ответ №1:
С точки зрения чистого SQL, для этого вам нужна производная таблица. Я надеюсь, что какой-нибудь эксперт поправит меня, если я ошибаюсь, но вы не можете использовать оператор SQL, как в массиве.
Предположим, что ваша конструкция таблицы :
CREATE TABLE foos ( id UUID NOT NULL PRIMARY KEY, keywords varchar[] NOT NULL );
Тогда SQL-способом получения результатов будет :
select * from ( select id, unnest(keywords) as keyw from foos ) myTable where keyw like '%foo%'
В противном случае синтаксис, который вы используете для like
оператора, кажется правильным.
myProperty like s"%$myVariable"
Комментарии:
1. Код компилируется. Он не компилируется без
.any
. Я не реализовал какой-либо постфиксный метод..any
поставляется с slickpg. Я попробовалList[String]
с тем же результатом.2. не могли бы вы распечатать сгенерированный sql-запрос, пожалуйста ? вы можете использовать
.statements
для получения сгенерированного запроса3. пожалуйста, взгляните. Я обновил свой пост с помощью сгенерированного sql.
4. не могли бы вы также распечатать схему вашей таблицы, пожалуйста ?
5. схема sql добавлена в сообщение.