2009-10-13 16 views
24

Czy ktoś wie o ważności metod Hibernate'a: Criteria.list() i Query.list() zwracających wiele wystąpień tego samego obiektu?Czy to jest ważne dla listy hibernacji(), aby zwrócić duplikaty?

Od czasu do czasu podczas korzystania z interfejsu API Criteria, zmiana domyślnej strategii pobierania w mojej definicji odwzorowania klasy (z "wybierz" na "dołączanie") może czasami wpływać na to, ile odniesień do tej samej jednostki może pojawić się w wynikowym wyniku z list() i nie jestem pewien, czy traktować to jako błąd, czy nie. Jawadok nie definiuje go, po prostu mówi "Lista dopasowanych wyników zapytania". (dzięki chłopaki).

Jeśli jest to oczekiwane i normalne zachowanie, to mogę zdelegalizować listę osobiście, to nie jest problem, ale jeśli jest to błąd, wolałbym go uniknąć, a nie odrzucić wyników i spróbować zignorować to.

Ktoś ma jakieś doświadczenie w tej kwestii?

Odpowiedz

20

Tak, uzyskiwanie duplikatów jest całkowicie możliwe, jeśli konstruujesz swoje zapytania, aby tak się stało. Zobacz na przykład: Hibernate CollectionOfElements EAGER fetch duplicates elements

+6

+1. Jak mogę nie przekazać komuś linku do mojej odpowiedzi? :-) Poważnie, jednak - tak, Hibernate może zwracać duplikaty, gdy więcej niż jedno skojarzenie "do wielu" jest zadeklarowane z chęcią pobrania lub pobrane przy użyciu dołączenia pobierania w ramach tego samego zapytania. Zobacz notatkę na dole 14.3: http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql.html#queryhql-joins – ChssPly76

+0

Dzięki za link do dokumentu, wiedziałem, że być gdzieś tam – skaffman

+0

@ ChssPly76 Link jest zepsuty! – Champ

4

Jeśli masz obiekt, który ma listę obiektów podrzędnych na nim, a twoje kryteria łączą dwie tabele razem, możesz potencjalnie uzyskać duplikaty głównego obiektu.

Jednym ze sposobów zapewnienia, że ​​nie otrzymasz duplikatów, jest użycie DistinctRootEntityResultTransformer. Główną wadą jest to, że używasz buforowania zestawu wyników/liczenia rzędów. Te dwie nie działają razem.

4

Też zacząłem dostrzegać to zachowanie w moim API Javy, ponieważ zaczął się rozwijać. Cieszę się, że istnieje prosty sposób, aby temu zapobiec. Z praktyki zacząłem dołączanie:

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 

Do wszystkich moich kryteriów, które zwracają listę. Na przykład:

List<PaymentTypeAccountEntity> paymentTypeAccounts = criteria() 
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 
    .list(); 
Powiązane problemy