Ho attivato la registrazione SQL ed ho esaminato l'output della query. Per il caso precedente era questo:
/* load one-to-many com.prepaytec.pacasso.common.model.Card.purchaseProductGroups */
select
* /* the actual field list has been omitted for brevity */
from
pacasso.purchaseprodgrp_card purchasepr0_
inner join
pacasso.purchase_product_group purchasepr1_
on purchasepr0_.ppg_id=purchasepr1_.ppg_id
where
(
exists (
select
*
from
purchase_product_group ppg
where
ppg.ppg_id = purchasepr0_.ppg_id
AND ppg.ppg_status <> 'D'
)
)
and purchasepr0_.crd_id=?
Quindi il join necessario è già incluso e sembra come tutto ciò che sarebbe necessario è questo:
@Where(clause = "ppg_status <> 'D'")
Tuttavia, risulta che non funziona come Hibernate antepone l'alias di tabella sbagliato:
where
(
purchasepr0_.ppg_status <> 'D'
)
and purchasepr0_.crd_id=?
Sfortunatamente, una volta assegnato un alias a una tabella, non è possibile utilizzare il nome della tabella originale, quindi purchase_product_group.ppg_status <> 'D'
non funzionerebbe. E non sono a conoscenza di un modo per determinare il nome alias utilizzato da Hibernate a livello di codice, quindi al momento la scelta sembra essere hard-code il nome alias che viene trovato utilizzato da Hibernate (cioè purchasepr1_.ppg_status <> 'D'
) o per utilizzare exists
metodo descritto nella domanda.
AGGIORNAMENTO: Dopo ulteriori indagini si scopre che l'hardcoding dei nomi degli alias non è sempre praticabile. Ecco una query sui criteri in cui ciò non funzionerebbe:
/* criteria query */
select
* /* the actual field list has been omitted for brevity */
from
pacasso.merchant_acquirer this_
left outer join
pacasso.purchaseprod_merchant_acquirer purchasepr2_
on this_.mac_id=purchasepr2_.mac_id
and (
// This wouldn't work with any alias since the required
// table is pacasso.purchase_product purchasepr3_, which
// is joined below.
purchasepr2_.ppr_status <> 'D'
)
left outer join
pacasso.purchase_product purchasepr3_
on purchasepr2_.ppr_id=purchasepr3_.ppr_id
where
this_.mac_code=?
and this_.cst_id=?
Alla fine ho abbandonato il @Where
avvicinarsi e utilizzare @Filter
invece, il che sembra molto meglio in quanto può accettare HQL piuttosto che i nomi dei campi del database e quando applicato a livello di entità influenzerà le relazioni (a differenza di @Where
).