Sto cercando un modo per convalidare la query JPA a livello di codice.Come convalidare JPQL (query JPA) a livello di programmazione
All'interno di una transazione (Spring), ho un elenco di query da eseguire. Queste query possono contenere errori di sintassi che vorrei rilevare in modo che la transazione possa continuare.
La mia prima idea era di usare lo EntityManager
e creare ed eseguire le mie query, e nel caso in cui fallissero, potrei semplicemente rilevare l'eccezione, registrare un avviso e continuare.
Il problema è che quando si verifica un problema, la transazione viene contrassegnata per rollbackSolo così viene ripristinata la transazione corrente che non è ciò che voglio.
In pseudo-codice, va più o meno così:
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
}
L'alternativa che ho trovato finora è stato quello di creare un altro EntityManager
da quello originale (em.getEntityManagerFactory().createEntityManager()
), eseguire prima le mie domande in quello e poi ri-eseguirli (in caso di successo) in quello originale, ma questo non è davvero efficiente e sembra abbastanza brutto.
Sto usando EclipseLink come implementazione JPA e non posso passare a un'altra implementazione JPA.
EclipseLink deve avere un'estensione 'jpql.validation', che può convalidare l'espressione JPQL con HermesParser. – meskobalazs
Se puoi usare annotazioni, forse qualcosa come @Transactional (noRollbackFor = BadSqlGrammarException.class) – 6ton
@ 6ton sfortunatamente, questo qualcosa di interno a eclipselink (e forse JPA), quindi modificare l'annotazione non cambierà nulla. –