Forestil dig at have et værktøj, der automatisk kan registrere JPA og dvale ydelsesproblemer. Hyperssistensoptimering er det værktøj!
introduktion
i denne artikel skal vi se, hvordan vi kan sortere et FORESPØRGSELSRESULTATSÆT ved hjælp af en ordre efter klausul, der tager en tilfældig funktion leveret af en databasespecifik funktion.
dette er et meget praktisk trick, især når du vil blande et givet resultatsæt.
Bemærk, at sortering af et stort resultatsæt ved hjælp af en tilfældig funktion kan vise sig at være meget langsom, så sørg for at gøre det på små resultatsæt.
Hvis du skal blande et stort resultatsæt og begrænse det bagefter, er det bedre at bruge noget som Oracle
SAMPLE(N)
ellerTABLESAMPLE
i en tilfældig funktion i rækkefølge efter klausul.
databasetabel
lad os antage, at vi udvikler en Music player desktop-applikation, og vi har følgendesong
tabel i vores database.
song
tabellen udfyldes som følger:
id | artist | title |
---|---|---|
1 | Miyagi & Эндшпиль ft. Рем Дигга | I Got Love |
2 | HAIM | Don’t Save Me (Cyril Hahn Remix) |
3 | 2Pac ft. | Rise of a Champion |
4 | Ed Sheeran & passager | ingen Diggity (Kygo Remiks) |
5 | jp Cooper ft. Mali-Koa | al denne kærlighed |
brug af en tilfældig funktion i rækkefølge efter klausul
vi vil blande sanglisten, så hver nye afspilningsliste er anderledes end en tidligere genereret. Når vi har brug for at sortere et givet FORESPØRGSELSRESULTATSÆT, er vi nødt til at bruge ordreklausulen.
for at randomisere de returnerede rækker har vi dog brug for klausulen ORDER BY for at bruge en funktion eller et databaseobjekt, der returnerer en tilfældig værdi for hver række, der er indeholdt i resultatsættet.
som allerede nævnt er brug af en databasespecifik funktion, der returnerer tilfældige værdier, kun egnet til små resultatsæt. Heldigvis repræsenterer song
tabellen i vores tilfælde den aktuelle afspilningsliste for en desktop-applikation, hvorfor størrelsen på resultatsættet er rimelig.
Oracle
på Oracle skal du bruge funktionenDBMS_RANDOM.VALUE
som illustreret ved følgende eksempel:
SELECT artist||' - '||title AS songFROM songORDER BY DBMS_RANDOM.VALUE
Når du udfører forespørgslen ovenfor på Oracle, opnås følgende resultatsæt:
HAIM – red mig ikke (Cyril Hahn Remiks)
Ed Sheeran& passager – ingen Diggity (Kygo Remiks)
Miyagi& ren Ft. – Jeg fik Kærlighed
jp Cooper ft. Mali-Koa – al denne kærlighed
2pac ft. Bemærk, at sangene bliver opført i tilfældig rækkefølge takket være DBMS_RANDOM.VALUE
funktionsopkald, der bruges af Order by-klausulen.
VALUE
funktionen iDBMS_RANDOM
pakken returnerer en numerisk værdi i [0, 1) intervallet med en præcision på 38 fraktionerede cifre.
på kvm-serveren skal du bruge funktionen NEWID
som illustreret ved følgende eksempel:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY NEWID()
Når du udfører følgende resultatsæt er opnået:
Miyagi & ret ft. Jeg fik Kærlighed
Haim – red mig ikke (Cyril Hahn remiks)
2pac ft. Ed Sheeran& passager – ingen Diggity (Kygo Remiks)
JP Cooper ft. Mali – Koa-al denne kærlighed
Bemærk, at sangene vises i tilfældig rækkefølge takket være NEWID()
funktionsopkald, der bruges af Order by-klausulen.
NEWID
funktionen returnerer enuniqueidentifier
datatype, der repræsenterer en 16-byte GUID. Derfor vil hver ny værdi, der returneres afNEWID
– funktionen, være næsten unik.
Postgreskl
på Postgreskl skal du bruge funktionen random
som illustreret ved følgende eksempel:
SELECT artist||' - '||title AS songFROM songORDER BY random()
Når du udfører følgende resultatsæt er opnået:
jp Cooper ft. Mali-Koa – al denne kærlighed
2pac ft. HAIM – red mig ikke (Cyril Hahn Remiks)
Ed Sheeran & Passenger – No Diggity (Kygo Remiks)
Miyagi & ren Ft. Bemærk, at sangene vises i tilfældig rækkefølge takket værerandom()
funktionsopkald, der bruges af Order by-klausulen.
random
funktionen returnerer en numerisk værdi i [0, 1) intervallet fordouble precision
type.
Myskl
på Myskl skal du bruge funktionen RAND
som illustreret ved følgende eksempel:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY RAND()
Når du udfører forespørgslen ovenfor på Myskl, vises følgende resultat sæt opnås:
2pac ft. JP Cooper ft. Mali-Koa – al denne kærlighed
Miyagi& liter Ft. Jeg fik Kærlighed
ed sheeran & passager – ingen diggity (Kygo Remiks)
Haim – gem mig ikke (Cyril Hahn remiks)
bemærk, at sangene vises i tilfældig rækkefølge takket være RAND()
funktionsopkald bruges af ordren efter Klausul.
RAND
funktionen returnerer en numerisk værdi i [0, 1) intervallet af en flydende punkttype.
JPA og Hibernate
når du bruger JPA-og Hibernate-enhedsforespørgsler, kan du bare videregive den tilfældige funktion til ordreforespørgslen efter klausul som illustreret af følgende JPV-forespørgsel:
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY random()", Song.class).getResultList();
JPV-forespørgslen ovenfor fungerer fint for Postgreskl, siden random()
NEWID()
eller RAND()
funktionerne vil blive bestået af Hibernate as-is til KVL-ordren af.
For Oracle, da tilfældigheden er givet af DBMS_RANDOM.VALUE
talgenerator, skal du henvise til det som en KVM-funktion (f. eks. DBMS_RANDOM.VALUE()
):
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY DBMS_RANDOM.VALUE()", Song.class).getResultList();
det er det!
online værksteder
Hvis du nød denne artikel, vil jeg vædde på, at du vil elske mit kommende 4-dages online værksted!
- højtydende Java Persistens online værksted (4 timer 4 dage) mellem den 19.og 22. April
konklusion
randomisering af FORESPØRGSELSRESULTATSÆTTET er et fælles krav, så det er nyttigt at vide, hvilken funktion Du kan bruge i klausulen rækkefølge efter, afhængigt af den underliggende relationsdatabasetype.