powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Странное поведение
21 сообщений из 21, страница 1 из 1
Странное поведение
    #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
Странное поведение
    #38718986
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И даже если условие какое-то задаю, тоже дубли приходят в ответ, странно...
...
Рейтинг: 0 / 0
Странное поведение
    #38718990
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT, может там и есть две Светланы и два Антона?
...
Рейтинг: 0 / 0
Странное поведение
    #38718991
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanJulT, может там и есть две Светланы и два Антона?
нет, все по одному
...
Рейтинг: 0 / 0
Странное поведение
    #38718992
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

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

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


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


ЖЕСТЬ!!!
...
Рейтинг: 0 / 0
Странное поведение
    #38719043
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы были правы) спасибо!
но почему это не мой случай?
...
Рейтинг: 0 / 0
Странное поведение
    #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
Странное поведение
    #38719072
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

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


и вы ищете все объекты human у которых есть указательный палец, то хибер генерит обычно join и как результат вы получаете не одну строку а две. Но хиберу то пофиг(по дефолту) и он просто делает вам два объекта Human и у каждого из них в списке будет найденный палец. Вот в таком случае, и нужна та строчка.
Объяснил как дилетант, но как смог :)
...
Рейтинг: 0 / 0
Странное поведение
    #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
Странное поведение
    #38719097
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

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

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

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

а то мне кажется, что вы опять неверно что-то истолковали.
...
Рейтинг: 0 / 0
Странное поведение
    #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
Странное поведение
    #38719206
Sherst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так:
Код: java
1.
crit.SetResultTransformer(new DistinctEntityRootTransformer())
...
Рейтинг: 0 / 0
Странное поведение
    #38719222
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SherstА так:
Код: java
1.
crit.SetResultTransformer(new DistinctEntityRootTransformer())


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

Код: java
1.
org.hibernate.transform 
...
Рейтинг: 0 / 0
Странное поведение
    #38719239
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет ни класса - DistinctEntityRootTransformer(), ни метода с большой буквы - SetResultTransformer
...
Рейтинг: 0 / 0
Странное поведение
    #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
Странное поведение
    #38719266
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JulT,

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


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