2013-06-14 14 views
10

Due tabelle di database hanno una relazione di chiave esterna.Unire entità indipendenti con i criteri jpa api

Essi vengono mappati a due entità A e B da JPA, ma il join colonne vengono rimossi manualmente dalle entità, quindi in JPA classi mondiali A e B non sono correlati e non è possibile navigare da uno all'altro attraverso un campo/proprietà.

Utilizzando criteri api è possibile creare una query che unisce le due tabelle?

Tutti gli esempi che ho trovato su internet utilizza la colonna di join per raggiungere l'obiettivo, ma, come detto in precedenza, è stato rimosso dal codice perché la maggior parte di tempo non sono interessato al rapporto tra A e B e ho paura di possibili spese generali.

risposta

14

Primo: la relazione di chiave esterna non è solo per la navigazione. Servono principalmente a garantire che non vengano introdotti valori spuri nella relazione. Possono anche aiutare il database per l'ottimizzazione delle query. Ti consiglierei di riconsiderare questo.

In ogni caso, per la creazione di una query che utilizza diverse entità indipendenti, è necessario mettere loro come from (root) entità (come si farebbe in SQL o JPQL)

SELECT .... FROM Link l, Training t WHERE l.attribute = t.attribute; 

Root<Link> rootLink = criteriaQuery.from(Link.class); 
Root<Training> rootTraining = criteriaQuery.from(Training.class); 
... 
criteriaQuery.where(
    criteriaBuilder.equal(rootLink.get(link_.linkAttribute), trainingLink)); 
+0

Da segnalare che l'utilizzo di più radici crea un prodotto cartesiano (vale a dire un 'CROSS JOIN') tra le entità. Con la condizione 'WHERE', questo si comporta come un' INNER JOIN' (inclusa la stessa prestazione di quanto notato [qui] (https://stackoverflow.com/questions/670980#671023)). –

Problemi correlati