Salve a tutti,
seguendo questo articolo (Use Hibernate’s Custom Loaders to fake an aggregation view) sto tentando di simulare una vista (non vorrei doverla creare fisicamente sul database) usando una query.
ecco il mio codice:
codice:
@javax.persistence.Entity
@Entity(dynamicInsert=false, dynamicUpdate=false, mutable=false)
@Loader(namedQuery="loadArticoloView")
@SqlResultSetMapping(name="loadArticoloView",
entities=@EntityResult(entityClass=ArticoloView.class))
@NamedNativeQuery(name="loadArticoloView",
query="select " +
"a.id as id, nome, descrizione, posizione, prezzo, coefficientePrezzo, prezzoFinito, " +
"c.testo as categoria, " +
"m.quantita as quantita, " +
"(select nome" +
"from " +
"articolo_fattura " +
"left join fornitore on articolo_fattura.id_fornitore = fornitore.id " +
"where id_articolo = a.id " +
"order by data_fattura DESC " +
"limit 0,1) as fornitore " +
"from " +
"articolo a " +
"left join codcategoria c on c.id = a.id_categoria " +
"left join magazzino m on m.id_articolo = a.id " +
"where a.id = ?",
resultSetMapping="loadArticoloView")
public class ArticoloView {
String id;
String nome;
String descrizione;
String posizione;
Float prezzo;
Float coefficientePrezzo;
Float prezzoFinito;
String categoria;
Integer quantita;
String fornitore;
@Id
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
// altri getter e setter...
}
ed ecco come tento di recuperare l'entità:
codice:
Query q = em.createQuery("Select count(*) from ArticoloView", Long.class);
System.out.println(q.getResultList().get(0).toString());
ma hibernate continua a eseguire la seguente query: "select count(*) as col_0_0_ from ArticoloView articolovi0_"
con il conseguente errore Table 'articoloview' doesn't exist
(in teoria hibernate non dovrebbe generare la quary ma dovrebbe usare quella scritta da me, ca sembra che la ignori completamente, senza dare nessun messaggio di errore)
Tra i messaggi di inizializzazione ho trovato questi :
codice:
1621 [http-8080-2] INFO org.hibernate.cfg.AnnotationBinder - Binding entity from annotated class: com.example.testhibernate3.hibernate.view.ArticoloView
1624 [http-8080-2] INFO org.hibernate.cfg.annotations.QueryBinder - Binding named native query: loadArticoloView => select a.id as id, nome, descrizione, posizione, prezzo, coefficientePrezzo, prezzoFinito, c.testo as categoria, m.quantita as quantita, (select nomefrom articolo_fattura left join fornitore on articolo_fattura.id_fornitore = fornitore.id where id_articolo = a.id order by data_fattura DESC limit 0,1) as fornitore from articolo a left join codcategoria c on c.id = a.id_categoria left join magazzino m on m.id_articolo = a.id where a.id = ?
1625 [http-8080-2] INFO org.hibernate.cfg.annotations.EntityBinder - Bind entity com.example.testhibernate3.hibernate.view.ArticoloView on table ArticoloView
La prima riga tutto normale, ha mappato la mia classe.La seconda...sembra che abbia capito che deve usare la query (ma non conosco bene hibernate e non so esattamente come l'abbia intesa...). La terza riga...la tabella non esiste e questa entità non deve essere mappata su una tabella.
Qualcuno ha idea di cosa stia sbagliando ?