2012-06-27 40 views
5

Powiedzmy, że jestem w pętli tworzenia kwerend WZP:Czy obiekty zapytania JPA są zwracane przez wielokrotnego użytku EntityManager?

for(A elem : collection) { 
    emanager.createQuery("update A a set a.x=:y where a.id=:id") 
      .setParameter("id",elem.id) 
      .setParameter(":y", 123) 
      .executeUpdate(); 
} 

Czy mogę używać wracającą Query instancji?

Query query = emanager.createQuery("update A a set a.x=:y where a.id=:id"); 
for(A elem : collection) { 
    query 
      .setParameter("id",elem.id) 
      .setParameter(":y", 123) 
      .executeUpdate(); 
} 

Czy to dotyczy wszystkich przypadków Query? NamedQuery, NativeQuery itp Oczywiście, mówię o ponowne wystąpienie w tej samej EntityManager, czyli w ramach tej samej transakcji

Odpowiedz

-1

Jest wielokrotnego użytku dla zapytania. O ile próbowałem pracy.

+0

Dzięki, masz coś (np. Spec), aby to potwierdzić? A może to twoje własne doświadczenie? –

+0

To tylko moje doświadczenie. – yerlikayaoglu

+3

Ze specyfikacji JPA 2.1, sekcja "3.1.1 Interfejs EntityManager": Obiekty zapytania, TypedQuery, StoredProcedureQuery, CriteriaBuilder, Metamodel i EntityTransaction uzyskane od menedżera encji są ważne, gdy ten menedżer encji jest otwarty. –

-4

Dlaczego nie wypróbowałeś metod EntityManager do utrzymywania, aktualizacji, usuwania rejestrów do bazy danych?

emanager.persist(elem); // creates a register in the database, set the annotation for autoincrement id of new registers in the Entity for better performance. 

emanager.merge(elem); // updates a register in the database, chance the values of the Entity values and merge to persist changes to the register. 

emanager.remove(emanager.merge(elem)); // delete registers from database, you need to merge de entity before deleting to avoid deleting problems. 

więc można to zrobić i będzie działać prawidłowo:

for(A elem : collection) emanager.merge(elem); 
+0

-1: Czy przeczytałeś pytanie? Jak to odpowiada? –

+0

Tworzysz zapytanie, aby zaktualizować rejestr, chcesz zrobić to na bardziej efektywny sposób, więc pytasz, czy możesz ponownie użyć instancji kwerendy. Cóż, mówię ci, najefektywniejszy sposób aktualizacji z JPA. – memozac

+0

Twoja droga jest w rzeczywistości * mniej * wydajniejsza niż to, co robi OP (podpowiedź: scalanie wymaga wyboru i aktualizacji), a twoja odpowiedź nie określa, czy zapytanie jest wielokrotnego użytku czy nie. –

0

Próbowałem to dokładnie to samo, wykonując tę ​​samą kwerendę (update) wewnątrz pętli, a ja się „niezgodność danych” na 2. wykonanie. Więc umieściłem createQuery w pętli i działa dobrze. Nie dokładnie to, czego bym się spodziewał. Powiem, że to nie jest JPQL - to NamedNativeQuery.

Powiązane problemy