Newsgroup: it.comp.java
Titolo: EJB, Query in EM non funziona

Slave a tutti.
ho un piccolo problema. ho questa funzione all'interno di un EJB3.0
Stateless
    public List<Item> findSimilarItem(Item item) {
        ArrayList<Item> result = new ArrayList<Item>();
        ArrayList idList = (ArrayList) em.createQuery("" +
                "SELECT data.idItem FROM ( " +
                    "SELECT idItem , COUNT(*) AS howmany FROM ( " +
                        "SELECT idorder " +
                            "FROM bought " +
                            "WHERE idItem = 1 " +
                        ")AS these " +
                        "INNER JOIN bought " +
                        "ON bought.idOrder = these.idOrder " +
                        "AND bought.idItem <> 1 " +
                        "GROUP BY iditem " +
                    ") AS data " +
                "ORDER BY data.howmany DESC LIMIT 5)").getResultList
();
        for (int i = 0; i < idList.size(); i++) {
            Integer idItem = (Integer) idList.get(i);
            result.add(em.find(Item.class, idItem));
        }
        return result;
    }
ora, il parametro è fissato a 1 per semplicità, il fatto è che
eseguendo la query mi da questi errori:
- nella pagina web:
javax.ejb.EJBException: java.lang.IllegalArgumentException:
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: ( near
line 1, column 25 [SELECT data.idItem FROM ( SELECT idItem , COUNT(*)
AS howmany FROM ( SELECT idorder FROM entity.Bought WHERE idItem = 1 )
AS these INNER JOIN bought ON bought.idOrder = these.idOrder AND
bought.idItem <> 1 GROUP BY iditem ) AS data ORDER BY data.howmany
DESC LIMIT 5)]
	org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx
(Ejb3TxPolicy.java:77)
	org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83)
	org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:
190)
	org.jboss.aop.joinpoint.MethodInvocation.invokeNext
(MethodInvocation.java:102)
	org.jboss.aspects.tx.TxPropagationInterceptor.invoke
(TxPropagationInterceptor.java:76)
	org.jboss.aop.joinpoint.MethodInvocation.invokeNext
(MethodInvocation.java:102)
	org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
etc
etc
nel cmd di jboss:
14:24:18,578 ERROR [PARSER] line 1:25: unexpected token: (
14:24:18,578 ERROR [PARSER] line 1:43: unexpected token: COUNT
se eseguo la query direttamente sul database funziona.
idee?
grazie

 ho un piccolo problema. ho questa funzione all'interno di un EJB3.0
Non entro nei dettagli, ma sei conscio del fatto che quello non deve 
essere SQL, ma bensi' JPAQL?


A esatto. ho fatto CreateNativeQuery e ora va.

 ha
scritto:

Ciao, non vorrei fare il "professorino rompipalle"
pero' quando usi ejb3 hai "sotto" la JPA cioe' uno strato di persistenza
dati molto potente
Se utilizzi CreateNativeQuery lo escludi e vai al db con jdbc diretto e sql
vecchio.
Cio' e' un peccato. ci vuole uno sforzo minimo ed e' anche divertente e
utile imparare a usare la JPA per avere applicazioni nettamente migliori.
L'uso del native va limitato a rarissimi casi in cui si vuole usare qualche
feature particolare del DBMS, ma ti assicuro che e' quasi sempre evitabile.
Per esempio potrebbe servire per motivi prestazionali per fare un game
potresti usare dei trigger dialettali. Per il SW gestionale che facciamo
quasi tutti in Italia e' comuqnue sconsigliatissimo
P.S. Se sei in un team e hai un capo un po' rompipalle potrebbe pure
"cazziarti" o peggio per cio' ( anceh giustamente )
ciao Nicola
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/