Newsgroup: it.comp.java
Titolo: Problema JPQL e inesperienza

Salve a tutti.
Come da oggetto, vi scrivo sperando mi possiate dare un poco di 
delucidazioni riguardo al JPQL e a come creare una query sintatticamente 
corretta (cosa che non riesco ad ottenere).
Prima di tutto, il mio obbiettivo è lavorare con un database MySql a cui 
riesco già a connettermi e la cui struttura è la seguente.
Libri(id,titolo,ha_riassunto)	(chiave: id)
Autori(id, nome, cognome)	(chiave: id)
Libri_autori(libro_id,autore_id)(chiave: libro_id+autore_id)
Semplificando e andando al succo, ciò ke io devo fare è rendere 
possibile la ricerca, tramite GUI, a partire dal titolo O dall'autore.
Uso NetBeans 6.1 e il template ha creato Entity Classes che rendano 
persistenti le tabelle attraverso il codice, ed in particolari tali 
classi sono: Libri, Autori, LibriAutori, LibriAutoriPK.
Per fare una prova, stavo cercando di creare una query che mi 
permettesse, per esempio, di trovare tutti i libri di Oscar Wilde e 
visualizzare un MessageBox con le informazioni di ognuno.
Sono riuscito a fare funzionare una semplice query come la seguente:
query = emLibrary.createQuery("SELECT book FROM Libri book WHERE 
book.titolo  like '%Dorian%' ");
listBooks = query.getResultList();
Il problema è che, per esempio, se cerco di fare una ricarca basata
sull'autore, già mi perdo....ho provato varie cose, ma sembra che non 
funzioni quando uso LibriAutori come sponda per fare il join:
select book
from Libri book, LibriAutori la, Autori auth
where 
book.id
 = la.libro_id and la.autore_id = 
auth.id
 and auth.cognome 
like '%Wilde%'
oppure, ancora più semplice:
select la
from LibriAutori la
where la.libro_id = 1
Non capisco...
Il problema è che la strutura dello schema non è come penso io??
Ho provato anche, per la precedente query, qualcosa del tipo:
select la
from LibrosAutores la
where la.librosAutoresPK.libros_id = 1
ma niente....
Se qualcuno può darmi una mano, gli sarei molto grato....sono ancora 
moooolto alle prime armi!!! :(
Grazie a tutti
Ciao

 Libri_autori(libro_id,autore_id)(chiave: libro_id+autore_id)
Le query JPQL sono espresse in termini dei nomi delle classi Entity e 
delle loro proprietà.
Devi dirci come sono fatti gli entity non come sono mappati sul database.
Se fosse
class Libro {
    Long getId() {...}
    String getTitolo() {...}
    Autore getAutore() {...}
}
class Autore{
    Long getId() {...}
    String getNome() {...}
    String getCognome() {...}
}
per ottenere i libri di Wilde dovresti scrivere
SELECT l FROM Libro l WHERE l.autore.cognome = "Wilde"
Pero' devi prima postare il modello dei dati effettivo, se non si puo' 
aiutarti.
-- 
Andrea Francia
http://www.andreafrancia.it/

 
L'ho risolto GRAZIE! :)
Sono andato nel codice, per copiarlo e postarlo qui....e mi sono accorto 
che il problema non era tanto nella query, ma nel parametro....nel 
database il parametro si chiama libro_id, ma nel codice è stato tradotto 
come libroId....per uqesto la query non compilava!
Adesso pian piano posso andare avanti! :)
Grazei ancora per l'aiuto indiretto (che sempre è un aiuto;))!
Ciao

 come libroId....per uqesto la query non compilava!
Mi permetto di dare un ulteriore suggerimento: crea una bella batteria
di test, e integrali nel processo di build!
Ogni metodo delle classi DAO (o comunque delle classi che eseguono
query) deve avere dei test con tanto di dati usa-e-getta. Le query
infatti vengono "validate" solo quando le usi, se compilare-deployare-
cliccare ogni volta che si fa una modifica è un po' dispendioso...
senza contare che vedi subito se qualche modifica "avventata" crea
danni all'applicazione.
[OT] Ne approfitto anche per salutare tutti gli amici di ICJ, io vado
in ferie al Percfest di Laigueglia, ciao ciao a tutti!
--
www.megadix.it