Что эквивалентно оператору mysql RLIKE в Hibernate Query?

У меня есть следующий запрос, который прекрасно работает в MySQL.

SELECT * FROM Orders as o, Products as p  where o.productinfo RLIKE p.code;

Здесь я объединяю две таблицы заказов и продуктов с RLIKE.

Я пытаюсь реализовать то же самое в Hibernate.

Query query = session.createQuery("FROM Orders as o, Products as p  where o.productinfo RLIKE p.code");
List<Object[]> results = query.getResultList();

Когда я использовал RLIKE, во время выполнения выдается следующая ошибка.

{"errormessage":"org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: RLIKE 

Я попытался реализовать то же самое с помощью запроса LIKE и сопоставил его с "% p.code%".

Query query = session.createQuery("FROM Orders as o, Products as p  where o.productinfo LIKE '%p.code%'");

Но это совпадает со строкой "p.code", а не со значением.

Что эквивалентно RLIKE в HQL? Есть ли другой способ объединить две таблицы с LIKE в HQL?

Благодарю.

Answer by @YCF_L: Любой, кто пытается соединить две таблицы с оператором like в Hibernate (mysql), может сделать это следующим образом.

SELECT * FROM Orders as o, Products as p  where o.productinfo LIKE CONCAT('%',p.code,'%');

2 ответа

Решение

Что эквивалентно оператору mysql RLIKE в Hibernate Query?

RLIKE - это синоним REGEXP так что вы можете реализовать его в спящем режиме, используя REGEXP_LIKEВы можете посмотреть на это здесь: Как искать в нескольких столбцах, используя один оператор like в HQL (hibernate sql)


Я попытался реализовать то же самое с помощью запроса LIKE и сопоставил его с "% p.code%".

..., Products as p  where o.productinfo LIKE '%p.code%'");

Но это совпадает со строкой "p.code", а не со значением.

Это правда, потому что вы не передаете правильное значение p.codeВы передаете это как String, вместо этого у вас есть два пути:

Query query = session.createQuery("....Products as p  where o.productinfo LIKE '%:code%'");
//------------------------------------------------------------------------------^^^^^^^
query.setParameter("code", p.code);

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

Query query = session.createQuery("....  where o.productinfo LIKE '%" + p.code + "%'");

РЕДАКТИРОВАТЬ

Вы можете использовать как с CONCAT без указания '' как это:

SELECT * FROM Orders as o, Products as p  where o.productinfo LIKE CONCAT('%',p.code,'%');

Вы можете проверить регулярное выражение следующим образом: Restrictions.sqlRestriction(слово REGEXP '^[AZ][A-Za-z]*$')

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

Другие вопросы по тегам