public java.util.List<Classe> readClass() { java.util.List<Classe> res; try { //Query query = manager.createNativeQuery("SELECT * FROM Classe;"); //Query query = manager.createNativeQuery("SELECT c FROM Classe c"); // Query query = manager.createNamedQuery("Classe.findAll"); //questa funge! res = query.getResultList(); } catch(Exception e){res = null;} return res; }
@NamedQuery(name = "Classe.findAll", query = "SELECT c FROM Classe c"),
Ciao a tutti,perchè il codice sotto riportato: Codice: [Seleziona] public java.util.List<Classe> readClass() { java.util.List<Classe> res; try { //Query query = manager.createNativeQuery("SELECT * FROM Classe;"); //Query query = manager.createNativeQuery("SELECT c FROM Classe c"); // Query query = manager.createNamedQuery("Classe.findAll"); //questa funge! res = query.getResultList(); } catch(Exception e){res = null;} return res; }funziona bene nel caso in cui la Query è una namedQuery (terza riga commentata) mentre non funziona negli altri 2 casi?da notare che la namedquery Classe.findAll è così definita: Codice: [Seleziona]@NamedQuery(name = "Classe.findAll", query = "SELECT c FROM Classe c"),Cosa mi sfugge?
Query query = manager.createNativeQuery("SELECT c FROM Classe c");
Se uso una nativeQuery (quella della seconda riga commentata ad esempio, che è presa tale e quale dalla namedQuery generata automaticamente da Java),Codice: [Seleziona]Query query = manager.createNativeQuery("SELECT c FROM Classe c");il risultato è una List (java.util.List<>) vuota.
Vado a naso perchè senza ulteriori dettagli è difficile. La differenza sta nel sql utilizzato. Una NamedQuery utilizza i JPQL mentre la query nativa l'SQL del database che stai usando. Se provi ad interrogare il database direttamente (da qualche programma tipo mysql a linea di comando o qualsiasi cosa sia il tuo db) utilizzando la stessa query nativa, ti ritorna qualcosa?
Una named query mappa direttamente la select su classi che l'ORM conosce. Cosa che non puoi fare con la query nativa. Quindi se ti aspetti una List<TuaClasse> dove tua classe è una classe persistent semplicemente la cosa non funziona.
certo, adesso capisco come mai alla createNativeQuery() bisogna passare, come secondo parametro, il campo (??) class della classe persistente, in modo che sappia cosa restituire...Il problema adesso potrebbe essere nel caso in cui la select deve restituire solo alcuni campi di tabelle differenti, qualcosa del tipo:SELECT tab1.campo1, tab2.campo2 FROM tab1 INNER JOIN tab2 WHERE...
Beh in generale si utilizza un ORM come JPA per evitare di scrivere le query a mano e fa gestire il mapping allo strumento. Ad esser sincero non ho mai provato questo approccio con JPA e non lo uso da tempo, ma potresti provare ad andare di reflection e vedere la lista che ti ritorna query.getResultList() cosa contiene per farti un'idea (basta anche puntare un debugger come quello di eclipse a quel pezzo di codice, mettere un breakpoint sull'istruzione seguente a getResultList e passare il mouse sopra la list ritornata).