HQL-запрос с LIKE% не работает - PullRequest
0 голосов
/ 25 мая 2020

Я попытался воспроизвести этот SQL запрос, который работает для меня, я не скопировал точный синтаксис для проблем конфиденциальности, но я думаю, вы понимаете цель этого запроса.

SELECT t1.Column1, t2.Column2, t2.Column3
FROM Table1 as t1
INNER JOIN Table2 as t2 ON t1.Column1 LIKE %t2.Column2%
INNER JOIN Table2 as t2 ON t1.Column1 LIKE %t2.Column3% ;

в HQL запрос Я пробовал это, но, похоже, он не дал мне никаких результатов:

возвращает пустой список []

Запрос HQL:

session.createQuery("... where
t1.Column1 LIKE '%"+"t2.Column2"+"%'
and t1.Column1 LIKE '%"+"t2.Column3"+"%' ").list();

I Я пытался вставить фактические значения вместо столбцов, это действительно работает, но я думаю, что спящий режим обрабатывает атрибуты как необработанные значения, а не повторяет объекты. Кто-нибудь может предложить решение, я видел людей, подходящих к этой проблеме с критериями, но основная проблема в том, что я не делаю никаких ассоциаций между этими классами, поэтому я не думаю, что это сработает.

Я застрял с этой проблемой уже больше недели, одно очень простое решение, которое приходит мне в голову, но на самом деле не оптимально, заключается в выполнении для каждого l oop, подобного этому (сохраняя его как последнее решение):

//list1 of query result unique column2 values
//list2 of query result unique column3 values
for each (list1)
for each (list2)
HashSet<Object,Object> result = Session.createQuery("... where
t1.Column1 LIKE '%"+":list1"+"%'
and t1.Column1 LIKE '%"+":list2"+"%'").setParameter("list1",list1).setParameter("list2",list2).tolist();
HashSet<Object,Object> lastresult= new HashSet();
lastresult.add(result);

Ответы [ 3 ]

0 голосов
/ 25 мая 2020

Вы можете использовать класс Criteria для достижения того же результата,

например,

Criteria query = session.createCriteria(POJO class here);
query.add(Restrictions.like("t1.Column1", "t2.Column3", MatchMode.ANYWHERE));

Ниже приведен список доступных параметров MatchMode:

MatchMode.ANYWHERE - Match узор в любом месте строки.
MatchMode.END - сопоставить конец строки с образцом.
MatchMode.EXACT - сопоставить всю строку с образцом.
MatchMode.START - сопоставить начало строки с образцом.

0 голосов
/ 28 мая 2020

Обновление (решение):

Обновление: как и предполагалось, запрос обрабатывал свойства объекта как необработанные значения, а не как фактические объекты для выполнения итерации, поэтому подход, который я использовал, добавив знак «+», был ошибка, мне следовало использовать функцию CONCAT, и это решило мою проблему.

session.createQuery("... WHERE lower(t1.Column1) LIKE
Concat(Concat('%',lower(t2.Column2)),'%') and lower(t1.Column1) LIKE Concat(Concat('%',lower(t2.Column3)),'%')").tolist();
0 голосов
/ 25 мая 2020

Оберните его одиночными кавычками.

'% t2.Column2%'

...