Immagina di avere uno strumento in grado di rilevare automaticamente JPA e ibernare i problemi di prestazioni. Hypersistence Optimizer è quello strumento!
Introduzione
In questo articolo, vedremo come ordinare un set di risultati di query SQL utilizzando una clausola ORDER BY che accetta una funzione CASUALE fornita da una funzione specifica del database.
Questo è un trucco molto utile, soprattutto quando si desidera mescolare un determinato set di risultati.
Nota che l’ordinamento di un set di risultati di grandi dimensioni utilizzando una funzione CASUALE potrebbe risultare molto lento, quindi assicurati di farlo su set di risultati piccoli.
Se devi mescolare un set di risultati di grandi dimensioni e limitarlo in seguito, allora è meglio usare qualcosa come Oracle
SAMPLE(N)
oTABLESAMPLE
in SQL Server o PostgreSQL invece di una funzione casuale nella clausola ORDER BY.
Tabella del database
Supponiamo che stiamo sviluppando un’applicazione desktop del lettore musicale e abbiamo la seguente tabella song
nel nostro database.
La tabellasong
viene compilata come segue:
id | artist | title |
---|---|---|
1 | Miyagi & Эндшпиль ft. Рем Дигга | I Got Love |
2 | HAIM | Don’t Save Me (Cyril Hahn Remix) |
3 | 2Pac ft. DMX | Aumento Di Un Campione (GalilHD Remix) |
4 | Ed Sheeran & Passeggero | No Diggity (Kygo Remix) |
5 | JP Cooper ft. Mali-Koa | All This Love |
Usando una funzione CASUALE nell’ORDINE SQL PER clausola
Vogliamo mescolare l’elenco dei brani in modo che ogni nuova playlist sia diversa da quella generata in precedenza. Ogni volta che abbiamo bisogno di ordinare un determinato set di risultati di query SQL, dobbiamo usare la clausola ORDER BY.
Tuttavia, per randomizzare le righe restituite, abbiamo bisogno della clausola ORDER BY per utilizzare una funzione o un oggetto database che restituisca un valore casuale per ogni riga contenuta nel set di risultati SQL.
Come già accennato, l’utilizzo di una funzione specifica del database che restituisce valori casuali è adatto solo per piccoli set di risultati, altrimenti le prestazioni della query SQL saranno influenzate. Fortunatamente ,nel nostro caso, la tabellasong
rappresenta la playlist corrente di un’applicazione desktop, quindi la dimensione del set di risultati è ragionevole.
Oracle
Su Oracle, è necessario utilizzare la funzioneDBMS_RANDOM.VALUE
, come illustrato nel seguente esempio:
SELECT artist||' - '||title AS songFROM songORDER BY DBMS_RANDOM.VALUE
Quando si esegue la query SQL sopra su Oracle, si ottiene il seguente set di risultati:
HAIM – Don’t Save Me (Cyril Hahn Remix)
Ed Sheeran & Passeggero – No Diggity (Kygo Remix)
Miyagi & Эндшпиль ft. – Ho avuto amore
JP Cooper ft. Mali-Koa-Tutto questo amore
2Pac ft. DMX-Rise Of A Champion (GalilHD Remix)
Si noti che le canzoni vengono elencate in ordine casuale, grazie alla chiamata di funzioneDBMS_RANDOM.VALUE
utilizzata dalla clausola ORDER BY.
La funzione
VALUE
nel pacchettoDBMS_RANDOM
restituisce un valore numerico nell’intervallo [0, 1) con una precisione di 38 cifre frazionarie.
SQL Server
In SQL Server, è necessario utilizzare il tag NEWID
funzione, come illustrato dal seguente esempio:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY NEWID()
Quando si esegue la query SQL al di sopra di SQL Server, il seguente set di risultati, si ottiene:
Miyagi & Эндшпиль ft. In questo modo si può ottenere un buon risultato. In questo modo si può ottenere il massimo della qualità e della qualità del prodotto. Mali-Koa-All This Love
Si noti che le canzoni vengono elencate in ordine casuale, grazie alla chiamata di funzione NEWID()
utilizzata dalla clausola ORDER BY.
La funzione
NEWID
restituisce un tipo di datiuniqueidentifier
che rappresenta un GUID a 16 byte. Quindi, ogni nuovo valore restituito dalla funzioneNEWID
sarà praticamente unico.
PostgreSQL
Su PostgreSQL, è necessario utilizzare il tag random
funzione, come illustrato dal seguente esempio:
SELECT artist||' - '||title AS songFROM songORDER BY random()
Quando si esegue la query SQL di sopra su PostgreSQL, il seguente set di risultati, si ottiene:
JP Cooper ft. Mali-Koa-Tutto questo amore
2Pac ft. DMX – Aumento Di Un Campione (GalilHD Remix)
HAIM – Don’t Save Me (Cyril Hahn Remix)
Ed Sheeran & Passeggero – No Diggity (Kygo Remix)
Miyagi & Эндшпиль ft. Рем Дигга – I Got Love
Si noti che le canzoni vengono elencate in ordine casuale, grazie alla chiamata di funzione random()
utilizzata dalla clausola ORDER BY.
La funzione
random
restituisce un valore numerico nell’intervallo [0, 1) del tipodouble precision
.
MySQL
Su MySQL, è necessario utilizzare il tag RAND
funzione, come illustrato dal seguente esempio:
SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY RAND()
Quando si esegue la query SQL di sopra su MySQL, il seguente set di risultati, si ottiene:
2Pac ft. DMX-Ascesa di un campione (GalilHD Remix)
JP Cooper ft. Mali-Koa-Tutto questo Amore
Miyagi & ЭНдшпиль ft. Рем Дигга – I Got Love
Ed Sheeran & Passeggero – No Diggity (Kygo Remix)
HAIM – Don’t Save Me (Cyril Hahn Remix)
si Noti che le canzoni sono elencati in ordine casuale, grazie per il RAND()
chiamata di funzione utilizzata con la clausola ORDER by.
La funzione
RAND
restituisce un valore numerico nell’intervallo [0, 1) di un tipo a virgola mobile.
JPA e Hibernate
Quando si utilizza JPA e Hibernate entità query, è possibile passare solo la funzione random per la clausola ORDER BY, come illustrato dal seguente JPQL query:
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY random()", Song.class).getResultList();
Il JPQL query di cui sopra funziona bene per PostgreSQL, SQL Server, e MySQL dato che il random()
NEWID()
o RAND()
funzioni sarà passato da Hibernate per SQL ORDINE.
Per Oracle, poiché la casualità è data dalDBMS_RANDOM.VALUE
generatore di numeri, dovrai fare riferimento a esso come una funzione SQL (ad esempio, DBMS_RANDOM.VALUE()
):
List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY DBMS_RANDOM.VALUE()", Song.class).getResultList();
Questo è tutto!
Workshop online
Se ti è piaciuto questo articolo, scommetto che amerai il mio prossimo workshop online di 4 giorni!
- ad Alte Prestazioni Java Persistence Online Laboratorio (4 ore x 4 giorni) tra il 19 e il 22 aprile
Conclusione
Randomizzazione SQL set di risultati della query è un requisito comune, quindi è utile sapere che tipo funzione SQL è possibile utilizzare la clausola ORDER BY a seconda del database relazionale sottostante tipo.