powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Схожу с ума...
17 сообщений из 17, страница 1 из 1
Схожу с ума...
    #38717515
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Люди, я совсем запуталась. Помогите
Решила попробовать Criteria API Hib:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
 Session session = em.unwrap(Session.class);

        Criteria criteria = session.createCriteria(Client.class);
        criteria.setFirstResult(fromPosition);
        criteria.setMaxResults(countItems);

           if(nameMask!=null){
               System.out.println("name ="+nameMask);
               Criterion name = Restrictions.like("firstName", "%" + nameMask + "%").ignoreCase();
               criteria.add(name);
           }
        if(phoneMask!=null){
            System.out.println("phone ="+phoneMask);
            Criterion pMask = Restrictions.like("phone", "%" + phoneMask + "%").ignoreCase();
            criteria.add(pMask);
        }

        if(emailMask!=null){
            System.out.println("email ="+emailMask);
            Criterion eMask = Restrictions.like("email", "%" + emailMask + "%").ignoreCase();
            criteria.add(eMask);
        }


        List <Client> listRes = criteria.list();


Передаю:
Код: java
1.
2.
3.
name =ir
phone =760303
email =nat


Когда передаю по отдельности эти значения(т.е. поиск по одному like), все работает, когда вместе пытаюсь, чтобы наложить фильтры, ничего не выводит, ПОЧЕМУ????
запрос, который генерит хибер при этом:
Код: java
1.
select * where lower(this_.first_name) like ? and lower(this_.phone) like ? and lower(this_.email) like ? limit ?


ЧТО Я ДЕЛАЮ НЕ ТАК?
...
Рейтинг: 0 / 0
Схожу с ума...
    #38717567
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Берём трассировки, минимально причёсываем запрос, скармливаем штатному sql-инструменту и смотрим - есть ли такие записи?
...
Рейтинг: 0 / 0
Схожу с ума...
    #38717568
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

на стыке Java и SQL спорные вопросы можно решать прямыми запросами в БД.

Подключись к БД и выполни следующий код.

Код: sql
1.
select * where lower(this_.first_name) like 'ir' and lower(this_.phone) like '760303' and lower(this_.email) like 'nat' limit ?


Установи limit строк сколько надо.

По поводу знаков %. Умный билдер выражений или механизм биндинга может их врапить. И здесь надо уточнить
в каком виде % приходит в SQL машину. Возможно тебе вместо bind variable нужно сделать string substitution.
...
Рейтинг: 0 / 0
Схожу с ума...
    #38717712
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Код: sql
1.
2.
3.
4.
5.
select count(*)
where
     lower(this_.first_name) like 'ir%'
 and lower(this_.phone) like '%760303'
 and lower(this_.email) like '%nat%'

Ну или "около того", так как иначе - задлянафига тут like?
...
Рейтинг: 0 / 0
Схожу с ума...
    #38717760
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделала запрос напрямую в mysql, без всяких спрингов и хиберов. Результат с OR на скрине, как только ставлю в запросе AND - пусто
...
Рейтинг: 0 / 0
Схожу с ума...
    #38717764
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
короче судя по всему я неправильно поняла работу оператора лайк. всем огромное спасибо!!!
...
Рейтинг: 0 / 0
Схожу с ума...
    #38717783
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

У хибера уже есть лайк с игнором
Код: java
1.
Restrictions.ilike(String propertyName,Object value)



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

ЗЫ Кстати, хорошо бы писать как именно решили проблему, а то ценность темы "0", есть проблема, но нет решения.
...
Рейтинг: 0 / 0
Схожу с ума...
    #38717794
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiverJulT,

У хибера уже есть лайк с игнором
Код: java
1.
Restrictions.ilike(String propertyName,Object value)



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

ЗЫ Кстати, хорошо бы писать как именно решили проблему, а то ценность темы "0", есть проблема, но нет решения.
да собственно вы правы про условия.... нужно раньше с работы уходить, утром приходишь и все становится на свои места :)
я решила сделать так:
Код: java
1.
criteria.add(Restrictions.sqlRestriction("lower({alias}.email) like lower(?)", "%" + emailMask + "%",  StandardBasicTypes.STRING));


если я правильно понимаю, то такой способ предохраняет от инъекций. поэтому в моем случае ilike заменяется на like lower в запросе.
а если бы делала так:
Код: java
1.
Restrictions.like("email", "%" + emailMask + "%").ignoreCase();

, то вы правы, проще написать ilike нежели игнорКейс. Спасибо
...
Рейтинг: 0 / 0
Схожу с ума...
    #38717866
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

ради интереса попробовал сделать инжект вот таким образом
Код: java
1.
2.
3.
String value = "';insert into debug values('aaa');select 'aaa' from dual where 'qqq' like '";
criteria.add(Restrictions.ilike("surname", "%" + value + "%"));
Object o = criteria.list();


эффекта ноль. Хотя если подставить в любой sql редактор, то всё отрабатывает на ура.
Беглый поиск по гуглу, говорит что Criteria API в достаточной мере защищает от sql injection, как в принципе и любой другой механиз, если вы не получаете свой sql запрос конкатенацией строк.

ЗЫ если это действительно так, нет смысла городить огород, достаточно и ilike.
...
Рейтинг: 0 / 0
Схожу с ума...
    #38717886
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiverЗЫ если это действительно так, нет смысла городить огород, достаточно и ilike.
Любой адеватный фреймверк использует binding variables (PreparedStatement) и никакие SQL туда не заинжектить.
...
Рейтинг: 0 / 0
Схожу с ума...
    #38717980
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

тогда я не очень понимаю как оно в данном случае работает.
при запросе как я писал выше, в БД, судя по логу из p6spy, улетает вот такой запрос
Код: sql
1.
select col1,col2 … from table where lower(col1) like '%';insert into debug values('aaa');slect 'aaa' from dual where 'qqq' like '%'


данный запрос прекрасно выполняется, никаких ошибок не вываливается(хотя select написано с ошибкой), но и результата тоже никакого. Как видно никаких символов не заменено, т.е. всё как и было в начале.

если ручками выполнить такой запрос в том же Oracle sql developer, то отрабатывают всё 3 запроса(если селект поправить)
вопрос как оно работает? почему нет ошибки?
...
Рейтинг: 0 / 0
Схожу с ума...
    #38717987
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiver,

p6spy это же JDBC прокси? Он может сам за инлайнить переменные в SQL для более наглядного логирования. Смотреть на лог на уровне SQL сервера или родной hibernate-овский.
...
Рейтинг: 0 / 0
Схожу с ума...
    #38718063
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

сам хибер выдаёт вот такое
Код: plaintext
12:54:28 org.hibernate.type.descriptor.sql.BasicBinder TRACE - binding parameter [1] as [VARCHAR] - %';insert into debug values('aaa');slect 'aaa' from dual where 'qqq' like '%
по сути тоже самое.

всё больше и больше походит на магию :)
...
Рейтинг: 0 / 0
Схожу с ума...
    #38718074
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DDiverсам хибер выдаёт вот такое
Код: plaintext
12:54:28 org.hibernate.type.descriptor.sql.BasicBinder TRACE - binding parameter [1] as [VARCHAR] - %';insert into debug values('aaa');slect 'aaa' from dual where 'qqq' like '%
по сути тоже самое.

С фига ли оно тоже самое?? Написано же - binding parameter. А не часть SQL запроса. Поэтому никакой инъекции быть не может.

DDiverвсё больше и больше походит на магию :)
Чо? Какую нафиг магию? Что именно не понятно? Давай объясню.
...
Рейтинг: 0 / 0
Схожу с ума...
    #38718080
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulTСделала запрос напрямую в mysql, без всяких спрингов и хиберов. Результат с OR на скрине, как только ставлю в запросе AND - пусто

JulT.

Ты уверена что ты вообще правильно понимаешь постановку?

Тебе нужно "объединение" условий или их "пересечение"?
...
Рейтинг: 0 / 0
Схожу с ума...
    #38718116
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

точно, что-то я зациклился на самом sql и забыл что есть ещё и такой механизм.
...
Рейтинг: 0 / 0
Схожу с ума...
    #38718226
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonJulTСделала запрос напрямую в mysql, без всяких спрингов и хиберов. Результат с OR на скрине, как только ставлю в запросе AND - пусто

JulT.

Ты уверена что ты вообще правильно понимаешь постановку?

Тебе нужно "объединение" условий или их "пересечение"?
да уже все хорошо, and работает как надо, шеф доволен)
спасибо!
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Схожу с ума...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]