2015-07-01 41 views
7

Poszukuję sposobu programistycznego sprawdzenia poprawności zapytania JPA.Jak programowo sprawdzać kwerendę JPQL (kwerenda JPA)

W ramach transakcji (Spring), mam listę zapytań do uruchomienia. Te zapytania mogą zawierać błędy składni, które chciałbym przechwycić, aby transakcja mogła być kontynuowana.

Mój pierwszy pomysł polegał na użyciu EntityManager oraz utworzeniu i wykonaniu moich zapytań, a na wypadek niepowodzenia, mógłbym po prostu złapać wyjątek, zalogować ostrzeżenie i kontynuować.

Problem polega na tym, że gdy wystąpi problem, transakcja jest oflagowana dla wycofania tylko wtedy moja transakcja zostanie wycofana, co nie jest tym, czego chcę.

W pseudo kod, to idzie mniej więcej tak:

EntityManager em = ...; 
    em.getTransaction().begin(); 
    List<String> queries = Arrays.asList("select e from Department d", 
      "select d from Department d"); 
    for(String query:queries) { 
     TypedQuery<Department> typedQuery = em.createQuery(query, Department.class); // This can throw an exception 
     List<Department> deps = typedQuery.getResultList(); // This can also throw an exception 
     //... do some stuff with the departements 
    } 

Alternatywą znalazłem do tej pory było stworzenie kolejnego EntityManager od pierwotnego (em.getEntityManagerFactory().createEntityManager()), uruchom najpierw moje pytania w tym jednym i następnie powtórz je (w przypadku sukcesu) w oryginalnym, ale to naprawdę nie jest wydajne i wygląda dość brzydko.

Używam EclipseLink jako implementacji JPA i nie mogę przejść do innej implementacji JPA.

+0

EclipseLink powinien mieć rozszerzenie 'jpql.validation', które może potwierdzić wyrażenie JPQL za pomocą HermesParser. – meskobalazs

+0

Jeśli możesz używać adnotacji, to może coś takiego jak @Transactional (noRollbackFor = BadSqlGrammarException.class) – 6ton

+0

@ 6ton, niestety, to coś wewnętrznego w eclipselink (i może JPA), więc modyfikowanie adnotacji niczego nie zmieni. –

Odpowiedz

0

Przypuszczam, że chcesz przeprowadzić walidację w czasie kompilacji dla JPQL. Nie ma sposobu sprawdzenia, czy składnia zapytania jest poprawna.

Aby wykonać zadanie, które chcesz, użyj kryterium api zamiast JPQL. Sprawdź dokumentację dla api kryteriów. Będziesz musiał użyć metamodelu użytkownika do sprawdzania podczas kompilacji.

+0

Jak mogę użyć CriteriaBuilder z ciągiem pobranym z bazy danych? –

+0

Proszę sprawdzić oficjalną dokumentację: http://docs.oracle.com/javaee/6/tutorial/doc/gjrij.html – fotis

+0

Kryteria api używa operacji na poziomie obiektu. – fotis