2014-04-15 17 views
8

Sto usando i dati di primavera jpa e querydsl e intrappolati su come scrivere una semplice query piacevole a sinistra unire due tabelle. Supponiamo che io sono un'entità di progetto e un'entità attività con rapporto OneToMany definito nel progetto, mi piacerebbe fare qualcosa di simile:join sinistro con dati di primavera jpa e querydsl

select * from project p left join task t on p.id = t.project_id where p.id = searchTerm 
select * from project p left join task t on p.id = t.project_id where t.taskname = searchTerm 

In JPQL, dovrebbe essere:

select distinct p from Project p left join p.tasks t where t.projectID = searthTerm 
select distinct p from Project p left join p.tasks t where t.taskName = searthTerm 

Ho un Interfaccia ProjectRepository, che estende JpaRepository e QueryDslPredicateExecutor. Questo mi permette di accedere a metodo:

Page<T> findAll(com.mysema.query.types.Predicate predicate, Pageable pageable) 

So che a sinistra si uniscono può essere raggiunto facilmente con la creazione di un nuovo JPAQuery (entityManager). Ma non ho il gestore di entità esplicitamente iniettato con i dati primaverili jpa. C'è un modo semplice e semplice per costruire un predicato con join sinistro? Desideri che qualcuno qui abbia vissuto questo ed è in grado di darmi un esempio. Grazie.

Frey.

+0

Potresti esprimere ciò che ti serve in JPQL e non in SQL? Ora non sono sicuro se hai bisogno del join sinistro per il caricamento o qualcos'altro. –

+0

Ciao Timo, espressione JPQL aggiunta come richiesto –

risposta

6

Se vuoi esprimere un vincolo su compiti allora si può fare in questo modo

QProject.project.tasks.any().id.eq(searchTerm) 

Se si vuole esprimere precarico di alcuni compiti al posto tramite un LEFT JOIN non si può esprimere che tramite un predicato . Un predicato in Querydsl è un'espressione booleana per dove, join-on e parti della query.

+0

Ciao Timo, grazie per la risposta. Vuoi dire che any() può solo fornire un vincolo, senza caricare i dati dalla tabella esterna? –

+0

Sì, questa soluzione fornisce solo un vincolo sui risultati, non influenza il caricamento –

Problemi correlati