sql >> Databasteknik >  >> RDS >> Oracle

Hur lägger man till en where-klausul till en Hibernate @OneToMany explicit join-tabellentitet?

Jag slog på SQL-loggning och undersökte frågeutmatningen. För ovanstående fall var det detta:

/* 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=?

Så den nödvändiga anslutningen är redan inkluderad och den ser ut som allt som skulle behövas är detta:

@Where(clause = "ppg_status <> 'D'")

Det visar sig dock att inte gör det fungerar som Hibernate lägger till fel tabellalias:

where
    (
        purchasepr0_.ppg_status <> 'D'
    )
    and purchasepr0_.crd_id=?

När ett alias väl har tilldelats en tabell är det tyvärr inte möjligt att använda det ursprungliga tabellnamnet - så purchase_product_group.ppg_status <> 'D' skulle inte fungera. Och jag är inte medveten om något sätt att bestämma aliasnamnet som används av Hibernate programmatiskt - så för närvarande verkar valet vara antingen hårdkoda aliasnamnet som visar sig användas av Hibernate (dvs. purchasepr1_.ppg_status <> 'D' ) eller för att använda exists metod som beskrivs i frågan.

UPPDATERING: Vid ytterligare undersökning visar det sig att hårdkodning av aliasnamnen inte alltid fungerar. Här är en kriteriefråga där detta inte skulle fungera:

/* 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=?

Till slut övergav jag @Where och använde @Filter istället, vilket verkar mycket bättre eftersom det kan acceptera HQL snarare än databasfältnamn och när det tillämpas på enhetsnivå kommer det att påverka relationer (till skillnad från @Where ).




  1. PHP Database Dump Script - finns det några problem?

  2. MySQL:Välj alla datum inom ett intervall även om inga poster finns

  3. Hur man synkroniserar data mellan två tabeller i olika databaser (MYSQL) som körs på olika servrar

  4. Använder LIKE i bindParam för en MySQL PDO-fråga