2015-07-01 9 views
7

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.

+0

EclipseLink deve avere un'estensione 'jpql.validation', che può convalidare l'espressione JPQL con HermesParser. – meskobalazs

+0

Se puoi usare annotazioni, forse qualcosa come @Transactional (noRollbackFor = BadSqlGrammarException.class) – 6ton

+0

@ 6ton sfortunatamente, questo qualcosa di interno a eclipselink (e forse JPA), quindi modificare l'annotazione non cambierà nulla. –

risposta

0

Suppongo che si desideri la convalida in tempo reale per JPQL. Non c'è modo di verificare se la sintassi della query è corretta.

Per eseguire il lavoro desiderato, utilizzare l'API dei criteri anziché JPQL. Controllare la documentazione per il criterio api. È necessario il metamodello dell'utente per il controllo in fase di compilazione

+0

Come potrei usare il CriteriaBuilder con una stringa recuperata da un database? –

+0

Si prega di controllare la documentazione ufficiale: http://docs.oracle.com/javaee/6/tutorial/doc/gjrij.html – fotis

+0

Criteri api utilizza le operazioni a livello di oggetto. – fotis