Mam kryteria, które zwraca wszystkie dane aplikacja wymaga zasadniczo:Hibernate Kryteria: odrębne podmioty i następnie ograniczyć
Criteria criteria = session.createCriteria(Client.class);
criteria.createAlias("address", "address");
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.setFirstResult(init);
criteria.setMaxResults(max);
List<Client> clients = criteria.list();
Problem polega na tym, że klient relacja/adres jest dwukierunkowy: na klient ma jeden adres i jeden adres może należeć do więcej niż jednego klienta.
Chcę pobrać "pojedynczych" obiektów klienckich na podstawie ich pk oczywiście, pewną liczbę klientów, ponieważ są one wyświetlane w tabeli.
Ponieważ polecenia setFirstResult/setMaxResults są wykonywane jako pierwsze, otrzymuję zduplikowanych klientów w ramach już zastosowanych limitów. Po tym, jak (poziom aplikacji został użyty jako nie przez grupę), hibernacja uzyskuje zrzuty duplikatów klientów, więc kończę na mniejszej liczbie klientów niż maksymalna podana w setMaxResults.
Nie można grupować według grupy (grupy projekcji), ponieważ nie zwraca wszystkich kolumn wymaganych w kliencie/adresie, tylko grupa, do której zgrupowane jest zapytanie.
(Podsumowując, Moja tabela ma 100 wyników na stronę, ale po odrzuceniu duplikatów mam 98 wyników zamiast 100 ...), ponieważ limit: LIMIT 0,100 jest stosowany PRZED hibernacji, kiedy powinien zostać wykonany PO)
FetchMode.SELECT naprawił to dla mnie - inne tryby nie działają w tym przypadku. –
FetchMode.SELECT jest świetny ... z wyjątkiem tego, że wymusza on szybkie pobieranie, z jakiegoś powodu. Zobacz https://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/FetchMode.html Czy nie ma sposobu, aby powiedzieć hibernacji po prostu, aby zrobić "odrębny" na pk pobranego obiektu ?? Wydaje się to najbardziej oczywistą i banalną rzeczą, której pragniemy, a jak zwykle hibernacja czyni życie niezwykle skomplikowanym. – Marc
Nawiasem mówiąc, robienie tego z HQL jest tak samo banalne jak się wydaje. Po prostu dodajesz słowo "odrębny" w zapytaniu. Dlaczego jest to tak boleśnie uciążliwe za pomocą API Criteria, jest poza mną. Czy wszyscy możemy zacząć korzystać z baz danych OO? – Marc