2012-04-02 14 views
5

CriteriaQuery w JPA2.0 zapewnia bezpieczny sposób dokonywania wyboru, jest świetny. Ale zastanawiam się, dlaczego nie zapewni operacji aktualizacji/usunięcia? Aby zbiorczo aktualizować/usuwać, musisz powrócić do dawnego czasu pisania tekstu SQL lub JPQL podatnego na błędy. IMO, CriteriaQuery do aktualizacji/usuwania nie powinno być trudnym zadaniem, ponieważ obsługa przyczyn jest taka sama w przypadku wyboru.Dlaczego JPA CriteriaQuery nie dostarcza zapytania o aktualizację?

Mam nadzieję, że zostanie to wprowadzone w następnej wersji JPA.

+1

Twoje życzenie się spełniło :) od wersji 2.1 JPA dostępne jest 'CriteriaUpdate' –

Odpowiedz

1

Ponieważ JPA jest narzędziem ORM, którego motywacją jest odwzorowywanie rekordów bazy danych na obiekty, tak aby można było manipulować rekordami bazy danych za pomocą języka programowania zamiast SQL, nie zachęca to do korzystania z SQL/HQL/JPQL aby wykonać aktualizację.

Aby zapobiec używaniu błędów SQL lub JPQL do aktualizacji obiektów, po użyciu CriteriaQuery do pobrania listy obiektów można po prostu przechodzić między obiektami wynikowymi, a następnie zmieniać właściwości obiektu jeden po drugim w aby wykonać aktualizację zbiorczą lub usunąć. JPA powinien być w stanie wykryć zmiany dokonane na tych obiektach i wygenerować odpowiednie kody SQL, aby zaktualizować odpowiednie rekordy w grupie, gdy wywoływana jest nazwa EntityManager.flush().

+4

To brzmi rozsądnie. Ale wiąże się to z co najmniej dwiema transakcjami, jeśli rekordy są ogromne, na przykład usunięcie miliona rekordów, ten sposób jest niedopuszczalny. Po prostu myślę, że CriteriaQuery już pracował w SQL, który określa pewne warunki, a następnie wykonuje pracę. Dlaczego nie wspierać usuwania/aktualizacji w tym stylu, jak również. W każdym razie, obecnie muszę iść z zwykłym SQL dla usuwania/aktualizacji partii, jeśli kwota jest duża. –

+1

@ zx_wing prawidłowy punkt, dlatego w JPA 2.1 wprowadzono 'CriteriaUpdate' –

Powiązane problemy