Java >> Java tutorial >  >> Tag >> native

Tip til dvale:Sådan kortlægger du native forespørgselsresultater til enheder

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, som du gerne vil have mig til at svare på, bedes du efterlade en kommentar nedenfor.

Spørgsmål:

Min forespørgsel er for kompleks til JPQL, og jeg er nødt til at bruge en indbygget forespørgsel. Er der en måde at kortlægge resultatet af forespørgslen til administrerede enheder?

Løsning:

Hvis din forespørgsel returnerer alle kolonner, der er kortlagt af en enhed, kan du bede Hibernate om at tilknytte resultatet til en administreret enhed. Bagefter kan du bruge entiteten på samme måde som enhver anden enhed.

Der er 2 muligheder for at definere kortlægningen:

  1. Du kan bruge en implicit tilknytning, hvis dit forespørgselsresultat bruger de samme kolonnenavne som din enhedstilknytning.
  2. Du kan oprette din egen tilknytning, hvis kolonnenavnene ikke matcher enhedstilknytningen

Implicit kortlægning

Den implicitte kortlægning er lettere at bruge og den bedre tilgang til de fleste use cases. Du behøver kun at angive enhedens klasse som den anden parameter til createNativeQuery metode.

Book b = (Book) em.createNativeQuery("SELECT * FROM book b WHERE id = 1", Book.class).getSingleResult();

Eksplicit kortlægning Hvis kolonnenavnene på dit forespørgselsresultat ikke stemmer overens med kolonnenavnene på din enhedstilknytning, skal du selv definere tilknytningen. Du kan gøre dette med en @SqlResultSetMapping som angiver tilknytningen for hver enhedsattribut.

@SqlResultSetMapping(
	name = "BookMapping", 
	entities = @EntityResult(
		entityClass = Book.class, 
		fields = {
			@FieldResult(name = "id", column = "id"),
			@FieldResult(name = "version", column = "version"),
			@FieldResult(name = "title", column = "title"),
			@FieldResult(name = "publishingDate", column = "publishingDate"),
			@FieldResult(name = "publisher", column = "publisherid")}))

Som du kan se i kodestykket, er @SqlResultSetMapping kræver et navn og et @EntityResult annotation, som definerer tilknytningen til enheden.

Du skal derfor angive enhedens klasse og et sæt @FieldResult annotation, som definerer tilknytningen mellem resultatsætkolonnen og entity-attributten.

Du kan derefter bruge denne tilknytning ved at angive dens navn som den 2. nd parameter til createNativeQuery metode.

em.createNativeQuery("SELECT * FROM book b WHERE id = 1", "BookMapping").getSingleResult();


Få flere oplysninger:

@SqlResultSetMappings er en kraftfuld funktion, som giver dig mulighed for at definere komplekse tilknytninger til native forespørgselsresultater. Du kan også bruge den til at tilknytte forespørgselsresultatet til flere enheder eller POJO'er.


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