Java >> Java tutorial >  >> Tag >> while

Hibernate Tips:Sådan håndteres NULL-værdier, mens du bestiller forespørgselsresultater i JPQL

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 skal bestille resultatet af en JPQL-forespørgsel baseret på en kolonne, der indeholder NULL-værdier. Hvordan kan jeg definere, hvordan NULL-værdier skal håndteres?

Løsning:

Håndteringen af ​​NULL-værdier, mens du bestiller dit forespørgselsresultat, er sværere og samtidig enklere, end du kunne forvente.

JPA-specifikationen definerer, at NULL-værdier under bestilling skal håndteres på samme måde som bestemt af SQL-standarden. Standarden specificerer, at alle null-værdier skal returneres før eller efter alle ikke-null-værdier. Det er op til databasen at vælge en af ​​de to muligheder.

Det gør håndteringen af ​​NULL-værdier mere eller mindre udefineret. SQL-standarden fiksede det ved at introducere NULLS FIRST og NULLS LAST klausuler, som gør det muligt for dig at definere placeringen af ​​NULL-værdier.

Desværre understøtter JPA-standarden ikke disse klausuler. Men de fleste JPA-implementeringer, inklusive Hibernate, understøtter dem alligevel, og der er en anmodning om at tilføje dem til JPA-specifikationen.

Lad os tage et kig på 2 Hibernate-eksempler, der bruger disse klausuler.

Returnering af NULL-værdier først

Følgende forespørgsel vælger alle Book enheder i faldende rækkefølge efter deres udgivelsesdato og sætter NULL-værdier først.

TypedQuery q = em.createQuery("SELECT b FROM Book b ORDER BY b.publishingDate DESC NULLS FIRST", Book.class);
List books = q.getResultList();

Som du kan se i den følgende logmeddelelse, genererer Hibernate en SQL-forespørgsel ved hjælp af en NULLS FIRST-sætning.

12:06:25,080 DEBUG [org.hibernate.SQL] - 
    select
        book0_.id as id1_0_,
        book0_.price as price2_0_,
        book0_.publishingDate as publishi3_0_,
        book0_.title as title4_0_,
        book0_.version as version5_0_ 
    from
        Book book0_ 
    order by
        book0_.publishingDate DESC nulls first

Returnering af NULL-værdier sidst

Og du kan selvfølgelig erstatte NULLER FØRST med en NULLS LAST klausul for at ændre placeringen af ​​poster, der indeholder NULL-værdier.

TypedQuery q = em.createQuery("SELECT b FROM Book b ORDER BY b.publishingDate DESC NULLS LAST", Book.class);
List books = q.getResultList();

Som du kan se i den følgende logmeddelelse, genererer Hibernate nu en SQL-forespørgsel ved hjælp af en NULLS LAST-sætning.

12:06:25,080 DEBUG [org.hibernate.SQL] - 
    select
        book0_.id as id1_0_,
        book0_.price as price2_0_,
        book0_.publishingDate as publishi3_0_,
        book0_.title as title4_0_,
        book0_.version as version5_0_ 
    from
        Book book0_ 
    order by
        book0_.publishingDate DESC nulls last

Få flere oplysninger:

Du kan lære mere om JPQL i følgende artikler:

  • Den ultimative guide til JPQL-forespørgsler med JPA og Hibernate
  • Dvaletips:Sådan bruger du paginering med JPQL
  • Tip til dvaletilstand:Sådan downcaster du enheder i JPQL-forespørgsler
  • Dvaletips:Sådan kalder du en standardfunktion i en JPQL-forespørgsel

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