JPA-kriterier

1. Oversikt

I denne veiledningen vil vi diskutere en veldig nyttig JPA-funksjon - Criteria Queries.

Det gjør oss ikke bare i stand til å skrive spørsmål uten å gjøre rå SQL, men gir oss også litt objektorientert kontroll over spørsmålene, som er en av hovedfunksjonene i dvalemodus. Criteria API lar oss bygge opp et kriterieforespørselsobjekt programmatisk, der vi kan bruke forskjellige typer filtreringsregler og logiske forhold.

Siden Hibernate 5.2 er Hibernate Criteria API avviklet, og ny utvikling er fokusert på JPA Criteria API. Vi vil undersøke hvordan du bruker dvalemodus og JPA til å bygge kriterier.

2. Maven-avhengigheter

For å illustrere API-en bruker vi referansen JPA-implementering - Hibernate.

For å bruke dvalemodus må du legge til den nyeste versjonen av den i din pom.xml fil:

 org. dvale dvalekjerne 5.3.2.Final 

Den siste versjonen av Hibernate finner du her.

3. Enkelt eksempel ved bruk av kriterier

La oss starte med å se på hvordan du henter data ved hjelp av kriterier. Vi tar en titt på hvordan du får alle forekomster av en bestemt klasse fra databasen.

Vi har en Punkt klasse som representerer tupelen "PUNKT" i databasen:

public class Element implementerer Serializable {private Integer itemId; private String itemName; privat streng elementBeskrivelse; privat Heltall elementPris; // standard setters og getters}

La oss se på et enkelt kriteriespørsmål som vil hente alle radene med “PUNKT" fra databasen:

Sessionsøkt = HibernateUtil.getHibernateSession (); CriteriaBuilder cb = session.getCriteriaBuilder (); CriteriaQuery cr = cb.createQuery (Item.class); Rotrot = cr.from (Item.class); cr.select (rot); Query query = session.createQuery (cr); Listeresultater = query.getResultList ();

Ovenstående spørsmål er en enkel demonstrasjon av hvordan du får tak i alle elementene. La oss se hva som ble gjort, trinn for trinn:

  1. Opprett en forekomst av Økt fra SessionFactory gjenstand
  2. Opprett en forekomst av CriteriaBuilder ved å ringe getCriteriaBuilder () metode
  3. Opprett en forekomst av Kriterier ved å ringe CriteriaBuildercreateQuery () -metoden
  4. Opprett en forekomst av Spørsmål ved å ringe ØktcreateQuery () metode
  5. Ring getResultList () metoden for spørsmål objekt som gir oss resultatene

Nå som vi har dekket det grunnleggende, la oss gå videre til noen av funksjonene i kriteriespørringen:

3.1. Ved hjelp av Uttrykkene

De CriteriaBuilder kan brukes til å begrense søkeresultatene basert på spesifikke forhold. Ved bruk av Kriterier Spørring hvor () metode og gi Uttrykkene laget av CriteriaBuilder.

Her er noen eksempler på ofte brukt Uttrykkene:

Slik får du varer som har en pris over 1000:

cr.select (root) .where (cb.gt (root.get ("itemPrice"), 1000));

Deretter får du ting som har varePris mindre enn 1000:

cr.select (root) .where (cb.lt (root.get ("itemPrice"), 1000));

Elementer som har itemNames inneholde Stol:

cr.select (root) .where (cb.like (root.get ("itemName"), "% chair%"));

Records har varePris mellom 100 og 200:

cr.select (root) .where (cb.between (root.get ("itemPrice"), 100, 200));

Slik sjekker du om den gitte eiendommen er null:

cr.select (root) .where (cb.isNull (root.get ("itemDescription")));

Slik sjekker du om den gitte eiendommen ikke er null:

cr.select (root) .where (cb.isNotNull (root.get ("itemDescription")));

Du kan også bruke metodene er tom() og isNotEmpty () for å teste om en Liste innenfor en klasse er tom eller ikke.

Nå kommer uunngåelig spørsmålet om vi kan kombinere to eller flere av de ovennevnte sammenligningene eller ikke. Svaret er selvfølgelig ja - Criteria API lar oss enkelt kjede uttrykk:

Predikere [] predikater = nytt predikat [2]; predikater [0] = cb.isNull (root.get ("itemDescription")); predikater [1] = cb.like (root.get ("itemName"), "chair%"); cr.select (root) .where (predikates);

Slik legger du til to uttrykk med logiske operasjoner:

Forutsi greaterThanPrice = cb.gt (root.get ("itemPrice"), 1000); Predikere chairItems = cb.like (root.get ("itemName"), "Chair%");

Elementer med de ovenfor definerte forholdene sluttet seg til Logisk ELLER:

cr.select (root) .where (cb.or (greaterThanPrice, chairItems));

For å få varene som samsvarer med de ovenfor definerte forholdene Logisk OG:

cr.select (root) .where (cb.and (greaterThanPrice, chairItems));

3.2. Sortering

Nå som vi vet den grunnleggende bruken av Kriterier, la oss ta en titt på sorteringsfunksjonene til Kriterier.

I det følgende eksemplet bestiller vi listen i stigende rekkefølge av navnet og deretter i fallende rekkefølge av prisen:

cr.orderBy (cb.asc (root.get ("itemName")), cb.desc (root.get ("itemPrice")));

I neste avsnitt vil vi se på hvordan vi kan utføre samlede funksjoner.

3.3. Projeksjoner, aggregater og grupperingsfunksjoner

Så langt har vi dekket de fleste grunnleggende temaene. La oss nå se på de forskjellige samlede funksjonene:

Få radtall:

CriteriaQuery cr = cb.createQuery (Long.class); Rotrot = cr.from (Item.class); cr.select (cb.count (root)); Query query = session.createQuery (cr); ListeartProjected = query.getResultList ();

Følgende er et eksempel på samlede funksjoner:

Samlet funksjon for Gjennomsnitt:

CriteriaQuery cr = cb.createQuery (Double.class); Rotrot = cr.from (Item.class); cr.select (cb.avg (root.get ("itemPrice"))); Query query = session.createQuery (cr); Liste avgItemPriceList = query.getResultList ();

Andre nyttige aggregatmetoder som er tilgjengelige er sum(), maks (), min (), telle() etc.

3.4. Kriterier Oppdatering

Fra og med JPA 2.1, er det støtte for å utføre databaseoppdateringer ved hjelp av Kriterier API.

Kriterier Oppdatering har en sett() metode som kan brukes til å gi nye verdier for databaseposter:

CriteriaUpdate criteriaUpdate = cb.createCriteriaUpdate (Item.class); Rotrot = criteriaUpdate.from (Item.class); criteriaUpdate.set ("itemPrice", newPrice); criteriaUpdate.where (cb.equal (root.get ("itemPrice"), oldPrice)); Transaksjonstransaksjon = session.beginTransaction (); session.createQuery (criteriaUpdate) .executeUpdate (); transaction.commit ();

I utdraget ovenfor oppretter vi en forekomst av Kriterier Oppdatering fra CriteriaBuilder og bruk dens sett() metode for å gi nye verdier for varePris. For å oppdatere flere egenskaper, trenger vi bare å ringe sett() metoden flere ganger.

3.5. Kriterier Slett

Kriterier Slett, som navnet antyder, muliggjør en sletteoperasjon ved hjelp av Kriterier API. Alt vi trenger er å lage en forekomst av Kriterier Slett og bruk hvor() metode for å bruke begrensninger:

CriteriaDelete criteriaDelete = cb.createCriteriaDelete (Item.class); Root root = criteriaDelete.from (Item.class); criteriaDelete.where (cb.greaterThan (root.get ("itemPrice"), targetPrice)); Transaksjonstransaksjon = session.beginTransaction (); session.createQuery (criteriaDelete) .executeUpdate (); transaction.commit ();

4. Fordel over HQL

I de forrige avsnittene har vi dekket hvordan du bruker kriterier.

Helt klart, den viktigste og mest hardtslående fordelen med Criteria-spørsmål over HQL er den fine, rene, Objektorienterte APIen.

Vi kan ganske enkelt skrive mer fleksible, dynamiske spørsmål sammenlignet med vanlig HQL. Logikken kan omformes med IDE og har alle typesikkerhetsfordelene ved selve Java-språket.

Det er selvfølgelig noen ulemper også, spesielt rundt mer komplekse sammenføyninger.

Så generelt sett må vi bruke det beste verktøyet for jobben - det kan i de fleste tilfeller være Criteria API, men det er definitivt tilfeller der vi må gå lavere.

5. Konklusjon

I denne artikkelen fokuserte vi på det grunnleggende i Criteria Queries in Hibernate og JPA, og også på noen av de avanserte funksjonene i API.

Koden som er diskutert her, er tilgjengelig i Github-depotet.


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