Newsgroup: it.comp.java
Titolo: jpa & dto

Una query polymorfica mi restituisce una lista di oggetti es:
String query_txt = "SELECT " +
                "c.nome, " +
                "SUM(c.soldi),  " +
                 "b.nome_carta"+
                  "From cliente c, banca b";
 Query query = em.createQuery(query_txt);
 List result = query.getResultList();
Come rappresento questa lista di oggetti nel presentation layer
(struts html)?
Ho bisogno di un dto?
Dto è antipttern per ejb3?
grazie

 Dto è antipttern per ejb3?
Se usi EJB3 puoi sostituire i VO (o DTO) con gli entity ejb3 (che sono
dei pojo serializzabili...cioè dei DTO). Ma se non hai disegnato la
tua applicazione con gli entity ejb3, cioè mappando la persistenza con
un ORM o JPA, allora devi per forza utilizzare un pattern DTO.
IMHO, la storia che DTO sia un anti-pattern per EJB3 è vera a
metà...nel senso che la nuova versione del framework già ti offre
gratis questo supporto e sarebbe una sciocchezza re-implementarla, con
tutte le conseguenze (se cambiano le strutture delle tabelle, devi
cambiare i Domain DTO mentre con un ORM devi cambiare il mapping, cioè
dei file di configurazione XML o delle semplici annotazioni).
--
IMHO

 IMHO
tky


Che intendi per query polymorfica? che viene costruita da un
controller e che può assumere varie forme (campi selezionati diversi e
clausole where in numero diverso)?
Se così, quello che cerchi è un po' difficile da trovare...dovresti
costruirti un layer proprietario che si occupi di costruire le classi
al volo in base al numero di campi restituiti dal resultset e al loro
tipo (si può fare con resultsetmetadata)...e poi in presentazione?
anche lì devi preoccuparti di "leggere" la struttura del bean che ti
arriva, e adattare la view per evitare eccezioni tipo "metodo non
trovato".
Escludendo la questione della query polimorfica...dovresti mappare il
join fra tabelle (quindi creare degli entitybean che non mappino
direttamente il dominio relazionale). Con Hibernate si può fare
tramite configurazione XML...in stile annotation non so.


Grazie per le tue risp.
per farla breve volevo sapere :
dato il codice di cui sopra
se si potesse evitare il seguente codice:
for (Iterator it = result.iterator(); it.hasNext();)
{
            Object[] tuple=( Object[])it.next();
            String nome=(String)tuple[0];
            BigDecimal soldi= (BigDecimal)tuple[1];
            String nomeCarta= (String )tuple[2];
OggettoAdOk objok= new OggettoAdOk ();
objok.setNome(nome);
objok.setSoldi(soldi);
objok.setNomeCarta(nomeCarta);
 }
con un cast diretto ad un oggetto craeato ad ok, semai un dto....
scusa se faccio confusione e grazie ancora ;))))).

 scusa se faccio confusione e grazie ancora ;))))).-
Non preoccuparti per la confusione. Ne vedo ogni giorno intorno a me:)
E io non ne sono certo immune...anzi!!
Cmq..il tuo problema dovrebbe risolversi semplicemente adottando jpa
(mai utilizzato ma il principio è quello del mapping ORM...).
Tanto, tu conosci gli attributi del tuo oggetto...non è dinamico.
E anche se fosse dinamico (nel senso che i campi restituiti dalla
query cambiano a seconda dei casi), potresti effettuare un mapping in
modo da considerare tutti i possibili campi che puoi selezionare
tramite la query.
Quindi, il tuo tool di persistenza-mapping (nel caso JPA) si occupa di
queste cose per te: quando iteri sulla lista dei risultati, ciò che ti
restituisce l'iterator è direttamente l'oggetto...non capisco
l'esigenza di quel codice, in effetti.
http://www.jpox.org/docs/1_2/tutorials/jpa_tutorial.html
Spero sia questo il tuo problema...