View Full Version : [JPQL] Consiglio query avanzata
Helldron
27-06-2010, 16:02
Ciao a tutti :) ,
devo creare una query scritta in JPQL che possa gestire gli oggetti di un Database relazionale. Ho già la classe che rappresenta la tabella del mio DB mappata con gli opportuni campi e anche il WS che gestisce la richiesta GET che fa uso di un oggetto EntityManager (quello che gestisce le operazioni di persistenza con i DataBase).
Ho una query SQL che dichiara 3 "variabili" che possono cambiare per ogni nuova richiesta.
La struttura è così
@var1 = "valore Che Può Cambiare Proveniente Dalla Richiesta Del Client";
@var2 = "valore Che Può Cambiare Proveniente Dalla Richiesta Del Client";
@var3 = "valore Che Può Cambiare Proveniente Dalla Richiesta Del Client";
select * , "qui ho una formula matematica che fa uso delle variabili var1 e var2" as "Alias"
from "Tabella" "nomeAliasTabella"
having "Alias" < @var3
order by "Alias" limit 10;
Visto che è una query un pochino complessa come posso muovervi con JPQL, o avete qualche tutorial che può darmi una mano??
Grazie mille!!!
Helldron
29-06-2010, 10:09
Nessun consiglio??
Ciao, se crei la query programmaticamente, tipo
int id=1;
Query q = entityManager.createQuery("select p from Persona p where p.id = ?1);
q.setParameter(1, id);
puoi specificare quanti parametri vuoi.
In alternativa, puoi usare le @NamedQuery, ti consiglio di guardarti un pò di documentazioni se vuoi andare nello specifico.
Helldron
29-06-2010, 18:58
Ciao, se crei la query programmaticamente, tipo
int id=1;
Query q = entityManager.createQuery("select p from Persona p where p.id = ?1);
q.setParameter(1, id);
puoi specificare quanti parametri vuoi.
In alternativa, puoi usare le @NamedQuery, ti consiglio di guardarti un pò di documentazioni se vuoi andare nello specifico.Hai ragione, infatti sto cercando di usare il metodo setParameter() però nell'altro modo, cioè del tipo
setParameter("Value",Object)
Se sei disponibile posso mandarti la query via mess pvt così magari ti viene qualche idea in più, poichè usa delle funzioni un pochino articolate??
Grazie :D !!
Possiamo continuare anche qui, può essere utile anche agli altri.
Come ti dicevo, ognuno dei parametri da passare alla query può essere utilizzando facendo il setParameter(), meglio ancora se sono tipi "semplici".
Ciao
Helldron
01-07-2010, 09:32
Possiamo continuare anche qui, può essere utile anche agli altri.
Come ti dicevo, ognuno dei parametri da passare alla query può essere utilizzando facendo il setParameter(), meglio ancora se sono tipi "semplici".
CiaoOk, però se hai visto come è strutturata ci sono delle funzioni dell'arcoseno, pi-greco (credo) e la potenza che cercando in giro mi sembra non si possano usare in JPQL.
Mi chiedo: come poter scriverla in questo linguaggio senza avere queste istruzioni?? Avevi parlato a proposito del dividere la query, potrebbe essere una soluzione??
Ok, però se hai visto come è strutturata ci sono delle funzioni dell'arcoseno, pi-greco (credo) e la potenza che cercando in giro mi sembra non si possano usare in JPQL.
Mi chiedo: come poter scriverla in questo linguaggio senza avere queste istruzioni?? Avevi parlato a proposito del dividere la query, potrebbe essere una soluzione??
Scusa, non mi ero accorto che il tuo problema era esattamente nell'uso di strumenti matematici "avanzati" dentro la query jpql :)
Hai due possibilità :
1) Calcolare via java, fuori dalla query i valori ottenuti utilizzando le funzioni matematiche (al massimo potresti usare una qualche libreria matematica esterna se ti serve qualcosa di più potente della java.math.*) e poi inserire i valori ottenuti dentro la query come se fossero valori singoli.
Ad esempio fai :
double powerSin = ASIN(SQRT(
POWER(SIN((x - abs(a)) * pi()/180 / 2),
2) + COS(@orig_lat * pi()/180 ) * COS(abs(y) *
pi()/180) * POWER(SIN((b - dest.lon) *
pi()/180 / 2), 2) ));
e poi passare la variabile powerSin dentro la query con il solito setParameter()
2)Utilizzare le query native. JPA infatti permette, di usare query SQL standard.
Il metodo
public Query createNativeQuery(
String sqlString,Class result-class);
Nel primo parametro passi la query sql, nel secondo il tipo di oggetto ritornato.
Dovresti leggere la documentazione per approfondire, io sinceramente non le ho mai usate.
Facci sapere come va a finire.
Helldron
03-07-2010, 11:08
Ok grazie per le dritte, proverò e ti farò sapere..
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.