Autore Topic: Interrogazione database da webservice Java  (Letto 2535 volte)

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Interrogazione database da webservice Java
« il: 06 Agosto 2013, 23:21:58 »
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?  :-\
Claudio CP La Rosa

Offline fulvio

  • Tech
  • *****
  • Post: 68
  • Karma: +0/-0
    • Mostra profilo
Re:Interrogazione database da webservice Java
« Risposta #1 il: 07 Agosto 2013, 13:57:35 »
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?  :-\

Sarebbe il caso di dire che significa non funziona bene...non ti ritorna risultati, non tutti, salta un eccezione?

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re:Interrogazione database da webservice Java
« Risposta #2 il: 07 Agosto 2013, 15:01:51 »
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.

Claudio CP La Rosa

Offline fulvio

  • Tech
  • *****
  • Post: 68
  • Karma: +0/-0
    • Mostra profilo
Re:Interrogazione database da webservice Java
« Risposta #3 il: 07 Agosto 2013, 20:34:07 »
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.

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re:Interrogazione database da webservice Java
« Risposta #4 il: 07 Agosto 2013, 22:03:52 »

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?

La tua risposta è talmente logica che mi stupisco di non averci pensato! Che scemo che sono!
Si, è proprio come dici tu!! :)

Citazione
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...
Claudio CP La Rosa

Offline fulvio

  • Tech
  • *****
  • Post: 68
  • Karma: +0/-0
    • Mostra profilo
Re:Interrogazione database da webservice Java
« Risposta #5 il: 08 Agosto 2013, 10:16:20 »
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).

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re:Interrogazione database da webservice Java
« Risposta #6 il: 08 Agosto 2013, 12:53:52 »

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).


Uso NetBeans, ma credo si possa fare ugualmente!
Ottimi suggerimenti, grazie! :)
Claudio CP La Rosa

Tags: