Spring Data JPA @Modifying Annotation

1. Introduktion

I denne korte vejledning vi lærer, hvordan du opretter opdateringsforespørgsler med Spring Data JPA @Forespørgsel kommentar. Vi opnår dette ved at bruge @Modifying kommentar.

Først opdaterer vi vores hukommelse og ser, hvordan vi laver forespørgsler ved hjælp af Spring Data JPA. Derefter dykker vi dybt ned i brugen af @Forespørgsel og @Modifying kommentarer. Endelig vil vi se, hvordan vi styrer tilstanden af ​​vores persistens-kontekst, når vi bruger ændringsforespørgsler.

2. Forespørgsel i Spring Data JPA

Lad os først opsummere 3 mekanismer, som Spring Data JPA giver til forespørgsel om data i en database:

  • Forespørgselsmetoder
  • @Forespørgsel kommentar
  • Brugertilpasset depotimplementering

Lad os oprette en Bruger klasse og et matchende Spring Data JPA-lager for at illustrere disse mekanismer:

@Entity @Table (name = "brugere", skema = "brugere") offentlig klasse bruger {@Id @GeneratedValue (strategi = GenerationType.IDENTITY) privat int id; privat strengnavn; privat LocalDate creationDate; privat LocalDate lastLoginDate; privat boolsk aktiv; privat streng e-mail; }
offentlig grænseflade UserRepository udvider JpaRepository {}

Forespørgselsmetodemekanismen giver os mulighed for at manipulere dataene ved at udlede forespørgslerne fra metodens navne:

Liste findAllByName (strengnavn); ugyldig deleteAllByCreationDateAfter (LocalDate dato);

I dette eksempel kan vi finde en forespørgsel, der henter brugere efter deres navne, eller alligevel en forespørgsel, der fjerner brugere, der har en oprettelsesdato efter en bestemt dato.

hvad angår @Forespørgsel kommentar, det giver os muligheden for at skrive en bestemt JPQL - eller SQL - forespørgsel i @Forespørgsel kommentar:

@Query ("vælg u fra bruger u hvor u.email ligesom '%@gmail.com'") Liste findUsersWithGmailAddress ();

I dette kodestykke kan vi se en forespørgsel, der henter brugere, der har en @ gmail.com email adresse.

Den første mekanisme gør det muligt for os at hente eller slette data. Med hensyn til den anden tillader det os at udføre stort set enhver forespørgsel. Imidlertid, til opdatering af forespørgsler skal vi tilføje @Modifying kommentar. Dette vil være emnet for denne vejledning.

3. Brug af @Modifying Kommentar

Det @Modifying kommentar bruges til at forbedre @Forespørgsel kommentar til at udføre ikke kun VÆLG forespørgsler, men også INDSÆT, OPDATER, SLET, og endda DDL forespørgsler.

Lad os lege med denne kommentar lidt og se, hvad den er lavet af.

Lad os først se et eksempel på en @Modifying UPDATE forespørgsel:

@Modifying @Query ("Opdater bruger u indstiller u.active = false hvor u.lastLoginDate <: date") ugyldig deaktivererUsersNotLoggedInSince (@Param ("date") LocalDate dato);

Her deaktiverer vi de brugere, der ikke logger ind siden en given dato.

Lad os prøve en anden, hvor vi sletter deaktiverede brugere:

@Modifying @Query ("slet bruger u hvor u.active = falsk") int deleteDeactivatedUsers ();

Som vi kan se, returnerer denne metode et heltal. Det er en funktion i Spring Data JPA @Modifying forespørgsler, der giver os antallet af opdaterede enheder.

Vi skal bemærke, at udførelse af en sletningsforespørgsel med @Forespørgsel fungerer forskelligt fra Spring Data JPA'er deleteBy navneafledte forespørgselsmetoder. Sidstnævnte henter først enhederne i databasen og sletter dem derefter en efter en. Dette betyder således, at livscyklusmetoden @PreRemove vil blive kaldt på disse enheder. Imidlertid med den førstnævnte udføres en enkelt forespørgsel mod databasen.

Lad os endelig tilføje en slettet kolonne til vores BRUGERE bord med en DDL forespørgsel:

@Modifying @Query (værdi = "ændre tabel USERS.USERS tilføj kolonne slettet int (1) ikke null standard 0", nativeQuery = true) ugyldig addDeletedColumn ();

Desværre efterlader brug af ændringsforespørgsler den underliggende persistens-kontekst forældet. Det er dog muligt at styre denne situation. Det er emnet for det næste afsnit.

4. Styring af Persistence-konteksten

Hvis vores ændringsforespørgsel ændrer enheder indeholdt i persistens-konteksten, bliver denne kontekst forældet. En måde at håndtere denne situation på er at rydde udholdenhedskonteksten. Ved at gøre det sørger vi for, at vedholdenhedskonteksten henter enhederne i databasen næste gang.

Vi behøver dog ikke eksplicit at kalde klar() metode til EntityManager. Vi kan bare bruge klart automatisk ejendom fra @Modifying kommentar:

@Modifying (clearAutomatically = true)

På den måde sørger vi for, at persistens-konteksten ryddes efter vores udførelse af forespørgslen.

Men hvad hvis vores vedholdenhedskontekst indeholdt ikke-skyllede ændringer? Derfor vil rydning af det betyde at droppe ikke-gemte ændringer. Heldigvis er der en anden egenskab ved kommentaren, vi kan bruge - skylles automatisk:

@Modifying (flushAutomatically = true)

Nu, den EntityManager skylles, før vores forespørgsel udføres.

5. Konklusion

Dette afslutter denne korte artikel om @Modifying kommentar. Vi har set, hvordan vi bruger denne kommentar til at udføre opdateringsforespørgsler som INDSÆT, OPDATER, SLET, og endda DDL. Derefter lærte vi, hvordan man styrede tilstanden af ​​vedholdenhedskonteksten med klart automatisk og skylles automatisk ejendomme.

Som sædvanlig er den fulde kode til denne artikel tilgængelig på GitHub.


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