Oracle
 sql >> Database >  >> RDS >> Oracle

Come aggiungere una clausola where a un'entità tabella di join esplicita Hibernate @OneToMany?

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 ).