Как выбрать с помощью СОДЕРЖИТ вместо КАК с JPA

#java #jpa-2.1 #postgresql-13 #java-15

Вопрос:

Я разрабатываю небольшие java-приложения для школьных проектов с помощью PostgreSQL.

Используя драйвер JDBC, я мог бы выбрать поле с помощью ~ оператора, чтобы действовать как CONTAINING вместо объединения фильтра с помощью LIKE .

Позвольте мне привести вам пример:

 SELECT * FROM USERS WHERE NAME ~ ? ORDER BY NAME
 

С тех пор как мы начали использовать платформу JPA для облегчения разработки, я заметил, что тот же пример с использованием JPA выдает ошибку при использовании ~ оператора…

Выдана ошибка:

 An exception occurred while creating a query in EntityManager: 
Exception Description: Syntax error parsing [select u from Users u where u.name ~ ?1 order by u.name]. 
[30, 41] The expression is not a valid conditional expression.
 

Все примеры кода, которые я смог найти в Google, сделаны с использованием LIKE вместо CONTAINING .

Мой вопрос в том, поддерживает ли JPA оператор containing при работе с PostgreSQL?

Немного информации:

 JDK 15
Netbeans 12.3
JPA 2.1
PostgreSQL 13.2
 

Ответ №1:

Ваша интуиция верна, потому jpa что не поддерживает ~ оператора, для получения дополнительной информации вы можете проверить ссылку oracle persistence-2_1, содержащую jpa спецификацию pdf со списком всех доступных jpa операторов, не включая ~ оператора. Операторы сравнения, доступный только следующие: =, >, >=, <, <=, <> (не равно), [не]между [не]как,[не так], это[не]имеет значение NULL, это[не]пустыми, [не]член[О], [не]существует

Комментарии:

1. Действительно жаль, содержит намного проще в использовании, может выбирать материал с пустыми параметрами и т. Д. Но спасибо за ответ!

2. @NickolasDeluca Добро пожаловать, к сожалению, у вас есть только две альтернативы : использовать один собственный запрос, в котором отсутствуют преимущества jpql, или переписать исходный запрос только с помощью этих операторов, если это возможно.

3. Не нужно подчеркивать это, полностью можно переписать, чтобы использовать КАК, это только менее желательно.

4. @NickolasDeluca Полностью согласен с вами.