Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с запросом / 8 сообщений из 8, страница 1 из 1
11.08.2014, 11:00
    #38717049
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с запросом
Почему когда делаю:
Код: java
1.
List<Human> findByPhoneContaining(String phoneMask, Pageable pageable);


работает
а когда добавляю
Код: java
1.
List<Human> findByPhoneContainingAndFirstNameContaining(String phoneMask, String nameMask, Pageable pageable);


уже ничего не выдает, как сделать так, чтобы искал по нескольким критериям, чтобы фильтры накладывались
Спасибо
...
Рейтинг: 0 / 0
11.08.2014, 11:12
    #38717058
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с запросом
Сделала or, все работает, но начальство сказало никаких or-ов, только and. Можно ли как-то по-другому переписать запрос?
...
Рейтинг: 0 / 0
11.08.2014, 11:24
    #38717063
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с запросом
Дорогая JulT, динамические "фильтры" это большая отдельная тема. И так с наскока она не решеается. Начальство резонно намекает на то что OR и будущие проблемы с производительностью в SQL запросах.

Честно, говоря, не знаю адекватного способа реализовать динамеческий фильтр в Hibernate или JPA API. И тем более в Spring Data, который вы, судя по всему используете.

Знаю следующие варианты:
1) Самый корявый - StingBuilder, который собирает JPQL или SQL запрос.
Код: java
1.
2.
3.
 if(nameParam != null){
   query.add(" AND NAME <> :name");
 }



2) Чуть менее корявый - Criteria API
Код: java
1.
2.
3.
if (!isEmpty(nameParam)){
    c.add(Restrictions.eq("name", nameParam));
}


Код выглядит не фонтан. Зато Hibernate Criteria API умеет очень много всего, ключая подзапросы, без которых в сложных фильтрах, часто никак.

3) Поиск объекта по примеру. Не знаю умеет ли JPA - Hibernate точно умеет. В сущности-примере заполняются только нужные свойства, и хибернейт фильтрует только по ним.
...
Рейтинг: 0 / 0
11.08.2014, 14:05
    #38717276
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с запросом
BlazkowiczДорогая JulT, динамические "фильтры" это большая отдельная тема. И так с наскока она не решеается. Начальство резонно намекает на то что OR и будущие проблемы с производительностью в SQL запросах.

Честно, говоря, не знаю адекватного способа реализовать динамеческий фильтр в Hibernate или JPA API. И тем более в Spring Data, который вы, судя по всему используете.

Знаю следующие варианты:
1) Самый корявый - StingBuilder, который собирает JPQL или SQL запрос.
Код: java
1.
2.
3.
 if(nameParam != null){
   query.add(" AND NAME <> :name");
 }



2) Чуть менее корявый - Criteria API
Код: java
1.
2.
3.
if (!isEmpty(nameParam)){
    c.add(Restrictions.eq("name", nameParam));
}


Код выглядит не фонтан. Зато Hibernate Criteria API умеет очень много всего, ключая подзапросы, без которых в сложных фильтрах, часто никак.

3) Поиск объекта по примеру. Не знаю умеет ли JPA - Hibernate точно умеет. В сущности-примере заполняются только нужные свойства, и хибернейт фильтрует только по ним.
Спасибо за отклик.
Решила использовать querydsl вместе с spring data
Код: java
1.
2.
3.
QClient q = QClient.client;
Predicate predicate = q.phone.contains(phoneMask).and(q.email.contains(emailMask));
List<Client> clientList = clientRepository.findAll(predicate, new PageRequest(fromPosition, countItems)).getContent();


Когда делаю так:
Код: java
1.
Predicate predicate = q.phone.contains(phoneMask));

- все прекрасно, данные возвращаются
как только ставлю:
Код: java
1.
Predicate predicate = q.phone.contains(phoneMask).and(q.email.contains(emailMask));


возвращается пустой clientList, ну почему-же????
...
Рейтинг: 0 / 0
11.08.2014, 14:18
    #38717287
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с запросом
Данные в таблице:
Код: plaintext
1.
2.
id                email                   phone
17          nat@bla.com	         12345678
21          user@bla.com    	 76030322
Делаю:
Код: java
1.
2.
Predicate predicate = q.phone.contains(phoneMask).and(q.email.contains(emailMask));
List<Client> clientList = clientRepository.findAll(predicate, new PageRequest(fromPosition, countItems)).getContent();


где
Код: java
1.
phoneMask="0322"

, а
Код: java
1.
emailMask="nat"

, fromPosition=0, countItems=4
Почему на выходе выдает только:
Код: java
1.
21          user@bla.com    	 76030322


Очень прошу помощи)
...
Рейтинг: 0 / 0
11.08.2014, 14:18
    #38717289
Nixic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с запросом
JulT,

а вы посмотрите сам sql запрос, который получается в результате вашим манипуляций. Например в хибернейте можно настроить его вывод в output. Или создайте переменную типа стринг и присваивайте ей текст запроса и смотрите через дебаг или туда же в output его. Или сразу в дебаге смотрите перепенные и их свойства в процессе выполнения.
...
Рейтинг: 0 / 0
11.08.2014, 14:41
    #38717317
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с запросом
JulT,

Странный способ искать приключения.
Если смущает код с ифом в теле метода, сделайте приватный метод который выполнит всю грязную работу. И будет всё в одну строчку. А то те же яйца вид сбоку, да ещё и не понятно как оно там внутри фурычит.
...
Рейтинг: 0 / 0
11.08.2014, 15:24
    #38717352
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с запросом
NixicJulT,

а вы посмотрите сам sql запрос, который получается в результате вашим манипуляций. Например в хибернейте можно настроить его вывод в output. Или создайте переменную типа стринг и присваивайте ей текст запроса и смотрите через дебаг или туда же в output его. Или сразу в дебаге смотрите перепенные и их свойства в процессе выполнения.
вот что в консоль выдает:

Код: java
1.
Hibernate: select count(client0_.id) as col_0_0_ from client client0_ where (client0_.email like ? escape '!') and (client0_.phone like ? escape '!') limit ?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с запросом / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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