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!