Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Странное поведение / 21 сообщений из 21, страница 1 из 1
13.08.2014, 09:08
    #38718983
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Criteria criteria = session.createCriteria(Human.class);
criteria.setFirstResult(0);
criteria.setMaxResults(8);
  if(nameMask!=null){
        Criterion name = Restrictions.ilike("firstName", "%" + nameMask + "%");
        criteria.add(name);
    }
    if(phoneMask!=null){
        Criterion pMask = Restrictions.ilike("phone", "%" + phoneMask + "%");
        criteria.add(pMask);
    }
  
  List<Human> humanList = criteria.list();   

    for(Human human: humanList){
        System.out.println("human  = "+human.getFirstName()+" phone = "+human.getPhone());
    }


Когда передаю firstName и phoneMask null (т.е. хочу выбрать всех Human-ов), выдает дублирующийся список почему-то:
Код: java
1.
2.
3.
4.
human  = Светлана phone = +70000000000
human  = Светлана phone = +70000000000
human  = Антон phone = +71111111111
human  = Антон phone = +71111111111


Почему такое странное поведение?
...
Рейтинг: 0 / 0
13.08.2014, 09:12
    #38718986
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
И даже если условие какое-то задаю, тоже дубли приходят в ответ, странно...
...
Рейтинг: 0 / 0
13.08.2014, 09:17
    #38718990
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
JulT, может там и есть две Светланы и два Антона?
...
Рейтинг: 0 / 0
13.08.2014, 09:20
    #38718991
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
wadmanJulT, может там и есть две Светланы и два Антона?
нет, все по одному
...
Рейтинг: 0 / 0
13.08.2014, 09:21
    #38718992
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
JulT,

включите логирование в хибере и посмотрите что именно улетает на сервак. такого не может быть.
Такое бывает когда условия применяется к списку объектов, внутри основного.
Можете конечно попробовать и вот такое, но думаю это не ваш случай, это как раз для описанного мною ранее
Код: java
1.
crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
...
Рейтинг: 0 / 0
13.08.2014, 10:28
    #38719032
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
DDiverJulT,

включите логирование в хибере и посмотрите что именно улетает на сервак. такого не может быть.
Такое бывает когда условия применяется к списку объектов, внутри основного.
Можете конечно попробовать и вот такое, но думаю это не ваш случай, это как раз для описанного мною ранее
Код: java
1.
crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);


"Такое бывает когда условия применяется к списку объектов, внутри основного."
и как этого избежать?
...
Рейтинг: 0 / 0
13.08.2014, 10:31
    #38719039
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
короче все решилось одной строчкой:
Код: java
1.
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);


ЖЕСТЬ!!!
...
Рейтинг: 0 / 0
13.08.2014, 10:32
    #38719043
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
вы были правы) спасибо!
но почему это не мой случай?
...
Рейтинг: 0 / 0
13.08.2014, 10:43
    #38719065
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
JulT,

просто судя по вашему коду, хибер должен был сгенерить что-то похожее на
Код: sql
1.
select t1.col1, t1.firstName, t1.phone … from Humans t1 where lower(t1.firstName) like '%nameMask%' and lower(t1.phone) like '%phone%'
...
Рейтинг: 0 / 0
13.08.2014, 10:47
    #38719072
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
JulT,

не ту кнопку нажал :)
т.е. при таом запросе не может быть никаких дублей, если сама таблица не содержит дублей.
но вот в случае если у вас иерархия, например объект human одержит список своих пальцев(как пример)
Код: java
1.
class Human {private List<Finger> fingers;}


и вы ищете все объекты human у которых есть указательный палец, то хибер генерит обычно join и как результат вы получаете не одну строку а две. Но хиберу то пофиг(по дефолту) и он просто делает вам два объекта Human и у каждого из них в списке будет найденный палец. Вот в таком случае, и нужна та строчка.
Объяснил как дилетант, но как смог :)
...
Рейтинг: 0 / 0
13.08.2014, 11:03
    #38719090
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
поставила
Код: java
1.
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);


теперь выдает только 5 Human:
Код: java
1.
2.
3.
4.
5.
human  = Валентина
human  = Сергей
human  = Дима
human  = Наталия
human = Светлана


а в базе их реально 10
совсем запуталась....
...
Рейтинг: 0 / 0
13.08.2014, 11:08
    #38719097
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
JulT,

Ещё раз, включите логирование SQL запросов у хибера. Это сразу избавит вас от головной боли, т.к. не придётся гадать ПОЧЕМУ???
...
Рейтинг: 0 / 0
13.08.2014, 11:11
    #38719104
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
DDiverJulT,

Ещё раз, включите логирование SQL запросов у хибера. Это сразу избавит вас от головной боли, т.к. не придётся гадать ПОЧЕМУ???
в консоли хибер выдает длинный запрос с кучей left outer join и в конце limit ?
...
Рейтинг: 0 / 0
13.08.2014, 11:30
    #38719134
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
JulT,

тогда так:
что за сущности вы выбираете/используете?
как они связаны?
какие условия задаёте?
и что вы хотите получить?

а то мне кажется, что вы опять неверно что-то истолковали.
...
Рейтинг: 0 / 0
13.08.2014, 12:20
    #38719196
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
DDiverJulT,

тогда так:
что за сущности вы выбираете/используете?
как они связаны?
какие условия задаёте?
и что вы хотите получить?

а то мне кажется, что вы опять неверно что-то истолковали.
Ок, приведу полную картину происходящего:
Код: 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.
Criteria criteria = session.createCriteria(Driver.class);

    criteria.setFirstResult(fromPosition);
    criteria.setMaxResults(countItems);
    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

    if(nameMask!=null){
        Criterion name = Restrictions.ilike("firstName", "%" + nameMask + "%");
        criteria.add(name);
    }
    if(phoneMask!=null){
        Criterion pMask = Restrictions.ilike("phone", "%" + phoneMask + "%");
        criteria.add(pMask);
    }
    if(carModelMask!=null){
        Criterion carModMask = Restrictions.ilike("autoModel", "%" + carModelMask + "%");
        criteria.add(carModMask);
    }
    if(carNumberMask!=null){
        Criterion carNumMask = Restrictions.ilike("autoNumber", "%" + carNumberMask + "%");
        criteria.add(carNumMask);
    }

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


Класс Driver:
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
@Entity
@Table(name = "driver")
public class Driver {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "phone", unique = true, nullable = false)
    private String phone;

    @Column(name = "auto_model")
    private String autoModel;

    @Column(name = "auto_mumber")
    private String autoNumber;

    @Column(name = "auto_class")
    @Enumerated(value = EnumType.STRING)
    private AutoClass autoClass;

    @OneToOne
    @JoinColumn(name = "account_id", unique = true, nullable = false, updatable = false)
    private Account account;

    @OneToOne
    @JoinColumn(name = "current_mission_id")
    private Mission currentMission;

    @Column(name = "state")
    @Enumerated(value = EnumType.STRING)
    private State state = State.OFFLINE;

    @OneToMany
    @JoinColumn(name = "booked_driver_id",insertable = true, updatable = true)
    private Set<Mission> bookedMissions = new HashSet<>();

    @ElementCollection(fetch = FetchType.EAGER)
    private List<String> photosCarsUrl = new ArrayList<>();


Условия такие:
Код: java
1.
String nameMask==null, String phoneMask==null, String carModelMask==null, String carNumberMask=null


т.е. хочу вытащить всех от 0 до 20 (в базе их 11)
...
Рейтинг: 0 / 0
13.08.2014, 12:30
    #38719206
Sherst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
А так:
Код: java
1.
crit.SetResultTransformer(new DistinctEntityRootTransformer())
...
Рейтинг: 0 / 0
13.08.2014, 12:40
    #38719222
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
SherstА так:
Код: java
1.
crit.SetResultTransformer(new DistinctEntityRootTransformer())


cannot resolve symbol DistinctEntityRootTransformer
где он лежит?
...
Рейтинг: 0 / 0
13.08.2014, 12:42
    #38719225
Sherst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
JulT,

Код: java
1.
org.hibernate.transform 
...
Рейтинг: 0 / 0
13.08.2014, 12:51
    #38719239
JulT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
нет ни класса - DistinctEntityRootTransformer(), ни метода с большой буквы - SetResultTransformer
...
Рейтинг: 0 / 0
13.08.2014, 12:56
    #38719251
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
JulT,

не парьте себе этим мозг, это одно и тоже.
Код: java
1.
public static final ResultTransformer DISTINCT_ROOT_ENTITY = DistinctRootEntityResultTransformer.INSTANCE;


Код: java
1.
public static final DistinctRootEntityResultTransformer INSTANCE = new DistinctRootEntityResultTransformer();


Код: java
1.
private DistinctRootEntityResultTransformer() {}
...
Рейтинг: 0 / 0
13.08.2014, 13:05
    #38719266
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Странное поведение
JulT,

возьмите sql запрос хибера и выполните его из какого-нибудь sql developer'а
и посмотрите что именно возвращает вам БД, именно по результатам этого запроса хибер и собирает вам объекты. Если рузультаты не те, нужно понять почему неверный запрос.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Странное поведение / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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