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.
EclipseLink powinien mieć rozszerzenie 'jpql.validation', które może potwierdzić wyrażenie JPQL za pomocą HermesParser. – meskobalazs
Jeśli możesz używać adnotacji, to może coś takiego jak @Transactional (noRollbackFor = BadSqlGrammarException.class) – 6ton
@ 6ton, niestety, to coś wewnętrznego w eclipselink (i może JPA), więc modyfikowanie adnotacji niczego nie zmieni. –