Newsgroup: it.comp.java
Titolo: Query JPQL e risultato "multiplo"

Salve a tutti,
volevo chiedervi un parere su come voi risolvereste un problema che ho 
incontrato io.
Allora, ho la seguente query:
     query = emLibrary.createQuery("SELECT book, auth FROM 
Libros book, 				LibrosAutores la, Autores auth" +
             	" WHERE 
book.id
 = la.librosAutoresPK.librosId and 			 
la.librosAutoresPK.autoresId = 
auth.id
 and 					auth.nombre=:param");
     query.setParameter("param", "Wilde");
     listBooks = query.getResultList();
Le classi Entità sono:
Libros, una classe che rispecchia una tabella Libros appunto che 
contiene i dati dei libri (id, titolo, ecc)
Autores, una classe che rispecchia una tabella Autores appunto che 
contiene i dati dei singoli autori(id, nome, cognome, ecc)
LibrosAutores, una classe che rispercchia una tabella che serve per la 
relazione M:N tra Autores e Libros e che tiene solo due campi librosId e 
autoresId.
Il mio problema è che non so come gestire al meglio le informazioni che 
ottengo; mi spiego meglio.
La query, così come l'ho scritta, viene compilata, funziona, ma non so 
come usarla perchè mi restituisce una List che è una lista di una coppia 
di oggetti (Libros e Autores)....
Non so accerdervi....
Voi come lo risolvereste? Mi serve tenere il libro ed il suo autore....
Le cose che vengono in mente a me sono:
-) cercare di usare come una List di coppie di oggetti Libro-Autore;
-) ogni volta che ho bisogno del'autore, eseguo un'altra query specifica 
dal titolo, magari una namedQuery precedentemente creata (questa mi 
sembra una soluzione più dispendiosa)
....spero di essere riuscito a spiegarmi, anche se non ne sono affatto 
sicuro....
Grazie a tutti,
Ciao

 autoresId.
Il peccato originale che ti incasina la vita è proprio l'introduzione 
della classe LibrosAutores.
Devi usare il ManyToMany:
@Entity
public class Book implements Serializable {
     private static final long serialVersionUID = 1L;
     private Long id;
     private List<Author> authors = new ArrayList<Author>();
     public void setId(Long id) {
 
this.id
 = id;
     }
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     public Long getId() {
         return id;
     }
     @ManyToMany
     public List<Author> getAuthors() {
         return authors;
     }
     public void setAuthors(List<Author> authors) {
         this.authors = authors;
     }
}
@Entity
public class Author implements Serializable {
     private List<Book> books;
     private static final long serialVersionUID = 1L;
     private Long id;
     public void setId(Long id) {
 
this.id
 = id;
     }
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     public Long getId() {
         return id;
     }
     @ManyToMany(mappedBy = "authors")
     public List<Book> getBooks() {
         return books;
     }
     public void setBooks(List<Book> books) {
         this.books = books;
     }
}
Nel caso tu abbia già un database con struttura prefissata che devi 
seguire allora devi specificare con i vari @Table, @JoinColumn, 
@JoinTable etc. che le tabelle sottostanti sono quelle che hai.
Non ti spiego come si fa perché non lo so. Prova a cercare degli esempi 
su interne e vedi che li trovi.
Se alla fine arrivi ad una soluzione facci sapere quale.
-- 
Andrea Francia
http://andreafrancia.blogspot.com/2008/06/macross-frontier.html

 su interne e vedi che li trovi.
Dato che volevo imparare qualcosa di nuovo ho studiato il problema.
Credo di avere trovato la soluzione.
Magari i nomi dei campi non sono proprio gli stessi che hai tu e mancano 
dei campi, pero' dovrebbe essere banale adattarla al tuo contesto.
Ecco la soluzione, fammi sapere se va bene.
@Entity
@Table(name="Libros")
public class Book implements Serializable {
     private Long id;
     private List<Author> authors = new ArrayList<Author>();
     protected String title;
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name="id")
     public Long getId() {
         return id;
     }
     @ManyToMany(cascade=CascadeType.PERSIST)
     @JoinTable(
         name="LibrosAutores",
         joinColumns=@JoinColumn(name="librosId", 
referencedColumnName="id"),
 
inverseJoinColumns=@JoinColumn(name="autoresId",referencedColumnName="id")
     )
     public List<Author> getAuthors() {
         return authors;
     }
     public String getTitle() {
         return title;
     }
     public void setTitle(String title) {
         this.title = title;
     }
     public void setId(Long id) {
 
this.id
 = id;
     }
     public void setAuthors(List<Author> authors) {
         this.authors = authors;
     }
}
@Entity
@Table(name="Autores")
public class Author implements Serializable {
     private Long id;
     protected String name;
     private List<Book> books;
     public Author() {
     }
     public Author(String name) {
 
this.name
 = name;
     }
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name="id")
     public Long getId() {
         return id;
     }
     @ManyToMany(mappedBy = "authors")
     public List<Book> getBooks() {
         return books;
     }
     @Column(name="nombre")
     public String getName() {
         return name;
     }
     public void setId(Long id) {
 
this.id
 = id;
     }
     public void setName(String name) {
 
this.name
 = name;
     }
     public void setBooks(List<Book> books) {
         this.books = books;
     }
}



Grazie MILLE!!!!
Per ora sembra funzionare. L'ho solo adattata al mio caso e cominciato 
ad utilizzarla in maniera leggera....appena perfeziono il tutto ti farò 
sapere!!!
Grazie mille ancora!!
Ciao