Java >> Java tutorial >  >> Tag >> class

Hibernate Tips:Sådan vælger du en specifik underklasse fra et arvehierarki

Hibernate Tips er en række indlæg, hvor jeg beskriver en hurtig og nem løsning på almindelige Hibernate-spørgsmål. Hvis du har et spørgsmål til et fremtidigt Hibernate Tip, bedes du efterlade en kommentar nedenfor.

Spørgsmål:

Jeg har en mange-til-mange tilknytning til superklassen i et arvehierarki. Hvordan kan jeg kun vælge en bestemt underklasse fra det hierarki?

Løsning:

Du kan bruge en TYPE udtryk i din JPQL-forespørgsel for at begrænse dit forespørgselsresultat til en eller flere underklasser. Lad os tage et kig på et eksempel.

Forfatter s kan skrive forskellige former for Publikation s, som en bog eller et blogindlæg . Du kan modellere det med et arvehierarki og en mange-til-mange-tilknytning mellem Forfatteren og Publikationen enhed. I dette eksempel kortlægger jeg arvehierarkiet med InheritanceType.SINGLE_TABLE strategi. Så alle entiteter i hierarkiet er knyttet til den samme tabel.

Lad os vælge alle bog s, der er skrevet af en specifik Forfatter . Jeg tilslutter mig derfor Forfatteren og Book enheder i FRA klausul, skal du kontrollere, at Author 's fornavn er lig med 'Thorben' og brug en TYPE udtryk for kun at vælge Bog enheder.

Query q = em.createQuery("SELECT b FROM Author a JOIN a.publications b WHERE a.firstName = 'Thorben' AND TYPE(b) = Book");
Book b = (Book) q.getSingleResult();

log.info(b);

Som du kan se i log-outputtet, bruger Hibernate diskriminatorkolonnen i Publication tabellen i Hvor klausul kun at vælge Book enheder.

13:02:22,453 DEBUG [org.hibernate.SQL] - 
    select
        publicatio2_.id as id2_1_,
        publicatio2_.publishingDate as publishi3_1_,
        publicatio2_.title as title4_1_,
        publicatio2_.version as version5_1_,
        publicatio2_.numPages as numPages6_1_,
        publicatio2_.url as url7_1_,
        publicatio2_.DTYPE as DTYPE1_1_ 
    from
        Author author0_ 
    inner join
        PublicationAuthor publicatio1_ 
            on author0_.id=publicatio1_.authorId 
    inner join
        Publication publicatio2_ 
            on publicatio1_.publicationId=publicatio2_.id 
    where
        author0_.firstName='Thorben' 
        and publicatio2_.DTYPE='Book'

Få flere oplysninger:

Hvis du bruger JPQL, er du måske også interesseret i min detaljerede guide om det:Ultimate Guide to JPQL Queries with JPA and Hibernate.

Og jeg skrev også en vejledning om JPA's forskellige strategier til at kortlægge arvshierarkier:Komplet vejledning:Arvstrategier med JPA og Hibernate.


Dvaletipsbog







Få flere opskrifter som denne i min nye bog Hibernate Tips:Mere end 70 løsninger på almindelige dvaleproblemer.

Den giver dig mere end 70 klar-til-brug opskrifter til emner som grundlæggende og avancerede kortlægninger, logning, Java 8-understøttelse, caching og statisk og dynamisk definerede forespørgsler.

Få det nu!



Java tag