Sorteren met JPA

1. Overzicht

Dit artikel illustreert de verschillende manieren JPA kan worden gebruikt om te sorteren.

2. Sorteren met JPA / JQL API

Het gebruik van JQL om te sorteren wordt gedaan met behulp van de Bestel per clausule:

String jql; Queryquery = entityManager.createQuery (jql);

Op basis van deze vraag genereert JPA de volgende rechtdoorzee SQL-instructie:

Slaapstand: selecteer foo0_.id als id1_4_, foo0_.name als naam2_4_ van Foo foo0_ order door foo0_.id

Merk op dat de SQL-sleutelwoorden in de JQL-string niet hoofdlettergevoelig zijn, maar de namen van de entiteiten en hun attributen wel.

2.1. De sorteervolgorde instellen

Standaard de sorteervolgorde is oplopend, maar het kan expliciet worden ingesteld in de JQL-string. Net als bij pure SQL zijn de bestelmogelijkheden asc en aflop:

String jql = "Selecteer f uit Foo als f order by f.id desc"; Query sortQuery = entityManager.createQuery (jql);

De gegenereerde SQL-query zal dan de orderrichting bevatten:

Slaapstand: selecteer foo0_.id als id1_4_, foo0_.name als naam2_4_ van Foo foo0_ order door foo0_.id desc

2.2. Sorteren op meer dan één kenmerk

Om op meerdere attributen te sorteren, worden deze toegevoegd aan de order door clausule van de JQL-string:

String jql; Query sortQuery = entityManager.createQuery (jql);

Beide sorteervoorwaarden verschijnen in het gegenereerde SQL-query uitspraak:

Slaapstand: selecteer foo0_.id als id1_4_, foo0_.name als naam2_4_ van Foo foo0_ order by foo0_.name asc, foo0_.id desc

2.3. Sorteerprioriteit van null-waarden instellen

De standaardprioriteit van null-waarden is databasespecifiek, maar dit kan worden aangepast via de EERSTE NULLS of NULLS LAATSTE clausule in de HQL-queryreeks.

Hier is een eenvoudig voorbeeld - bestellen per naam van Foo in aflopende volgorde en plaatsing Nuls aan het einde:

Query sortQuery = entityManager.createQuery ("Selecteer f uit Foo als f sorteer op f.name desc NULLS LAST");

De SQL-query die wordt gegenereerd, bevat de is null de 1 else 0 eindclausule (3e regel):

Slaapstand: selecteer foo0_.id als id1_4_, foo0_.BAR_ID als BAR_ID2_4_, foo0_.bar_Id als bar_Id2_4_, foo0_.name als naam3_4_, van Foo foo0_ volgorde per geval wanneer foo0_.name is null en dan 1 else 0 end, foo0_

2.4. Een naar veel relaties sorteren

Laten we voorbij de basisvoorbeelden gaan en nu kijken naar een use-case waarbij het sorteren van entiteiten in een een-op-veel-relatieBar met een verzameling van Foo entiteiten.

We willen de Bar entiteiten en ook hun verzameling Foo entiteiten - JPA is bijzonder eenvoudig voor deze taak:

  1. De collectie sorteren: voeg een OrderBy annotatie voorafgaand aan het Foo collectie in de Bar entiteit:
    @OrderBy ("naam ASC") Lijst fooList;
  2. De entiteit met de collectie sorteren:
    String jql = "Selecteer b uit Bar als b-volgorde door b.id"; Query barQuery = entityManager.createQuery (jql); Lijst barList = barQuery.getResultList ();

Merk op dat de @OrderBy annotatie is optioneel, maar we gebruiken het in dit geval omdat we de Foo verzameling van elk Bar.

Laten we eens kijken naar het SQL-vraag verzonden naar de RDMS:

Slaapstand: selecteer bar0_.id als id1_0_, bar0_.name als naam2_0_ uit Bar bar0_ order door bar0_.id Slaapstand: selecteer foolist0_.BAR_ID als BAR_ID2_0_0_, foolist0_.id als id1_4_0_, foolist0_.id als foolist0_.id als foolist0_0_.id als id1_oolist4_1_.BID .bar_Id als bar_Id2_4_1_, foolist0_.name als naam3_4_1_ van Foo foolist0_ waar foolist0_.BAR_ID =? bestellen door foolist0_.name asc 

De eerste query sorteert de ouder Bar entiteit. De tweede query wordt gegenereerd om de verzameling kinderen te sorteren Foo entiteiten die behoren tot Bar.

3. Sorteren met JPA Criteria Query Object API

Met JPA-criteria - de orderBy methode is een "one stop" alternatief om alle sorteerparameters in te stellen: zowel de order richting en de attributen om te sorteren door kan worden ingesteld. Hieronder volgt de API van de methode:

  • orderBy(CriteriaBuilder.asc): Sorteert in oplopende volgorde.
  • orderBy(CriteriaBuilder.desc): Sorteert in aflopende volgorde.

Elk Bestellen instantie wordt gemaakt met de CriteriaBuilder object via zijn asc of aflop methoden.

Hier is een snel voorbeeld - sorteren Foos door hun naam:

CriteriaQuery criteriaQuery = criteriaBuilder.createQuery (Foo.class); Root from = criteriaQuery.from (Foo.class); CriteriaQuery select = criteriaQuery.select (van); criteriaQuery.orderBy (criteriaBuilder.asc (from.get ("naam")));

Het argument voor de geDe methode t is hoofdlettergevoelig, aangezien deze moet overeenkomen met de naam van het attribuut.

In tegenstelling tot eenvoudige JQL, de JPA Criteria Query Object API dwingt een expliciete ordening af in de vraag. Merk op in de laatste regel van dit codefragment dat het criteriaBuilder object specificeert de sorteervolgorde die oplopend moet zijn door zijn asc methode.

Wanneer de bovenstaande code wordt uitgevoerd, genereert JPA de onderstaande SQL-query. JPA Criteria Object genereert een SQL-instructie met een expliciet asc clausule:

Slaapstand: selecteer foo0_.id als id1_4_, foo0_.name als naam2_4_ van Foo foo0_ order by foo0_.name asc

3.1. Sorteren op meer dan één kenmerk

Om op meer dan één attribuut te sorteren, geeft u gewoon een Bestellen instantie naar de orderBy methode voor elk kenmerk waarop moet worden gesorteerd.

Hier is een snel voorbeeld - sorteren op naam en ID kaart, in asc en aflop bestelling, respectievelijk:

CriteriaQuery criteriaQuery = criteriaBuilder.createQuery (Foo.class); Root from = criteriaQuery.from (Foo.class); CriteriaQuery select = criteriaQuery.select (van); criteriaQuery.orderBy (criteriaBuilder.asc (from.get ("naam")), criteriaBuilder.desc (from.get ("id")));

De bijbehorende SQL-query wordt hieronder weergegeven:

Slaapstand: selecteer foo0_.id als id1_4_, foo0_.name als naam2_4_ van Foo foo0_ order by foo0_.name asc, foo0_.id desc

4. Conclusie

Dit artikel onderzoekt de sorteeralternatieven in de Java Persistence API, zowel voor eenvoudige entiteiten als voor entiteiten in een een-op-veel-relatie. Deze benaderingen delegeren de last van het sorteerwerk naar de databaselaag.

De implementatie van deze JPA Sorting Tutorial is te vinden in het GitHub-project - dit is een op Maven gebaseerd project, dus het zou gemakkelijk te importeren en uit te voeren moeten zijn zoals het is.


$config[zx-auto] not found$config[zx-overlay] not found