2009-10-29 7 views
4

Je rencontre un problème avec une requête SELECT NEW.SELECT NEW dans JPQL

Query q = em.createQuery(
      "SELECT NEW com.bcbst.odstats.ejb.RangeStats(a.folderName, SUM(a.hits)) " + 
      "FROM ODStat a GROUP BY a.folderName"); 
return q.getResultList(); 

je reçois la stacktrace suivante lorsque je tente d'exécuter cette requête. RangeStats a des méthodes publiques, le FQN est précis, en fait RangeStats réside dans le même paquet que la classe qui fait la requête. J'ai déjà fait des requêtes sur ODStat, donc je suis également confiant que a.folderName et a.hits sont OK.

Je développe avec RAD 7.5, WAS 7, OpenJPA 1.2.1, MS SQL pilote JDBC 1.2.

at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:896) 
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1527) 
Caused by: javax.ejb.EJBException: See nested exception; nested exception is: 
<openjpa-1.2.1-SNAPSHOT-r422266:686069 nonfatal user error> 
org.apache.openjpa.persistence.ArgumentException: Result type "class 
com.bcbst.odstats.ejb.RangeStats" does not have any public fields or setter methods 
for the projection or aggregate result element "jpqlalias1", nor does it have a 
generic put(Object,Object) method that can be used, nor does it have a public 
constructor that takes the types [class java.lang.String, long]. 

Caused by: <openjpa-1.2.1-SNAPSHOT-r422266:686069 nonfatal user error> 
org.apache.openjpa.persistence.ArgumentException: Result type "class 
com.bcbst.odstats.ejb.RangeStats" does not have any public fields or setter methods 
for the projection or aggregate result element "jpqlalias1", nor does it have a 
generic put(Object,Object) method that can be used, nor does it have a public 
constructor that takes the types [class java.lang.String, long]. 

at org.apache.openjpa.kernel.ResultPacker.<init>(ResultPacker.java:139) 
at org.apache.openjpa.kernel.ResultPacker.<init>(ResultPacker.java:102) 
at org.apache.openjpa.kernel.QueryImpl.getResultPacker(QueryImpl.java:1262) 
at org.apache.openjpa.kernel.QueryImpl.toResult(QueryImpl.java:1212) 
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:990) 
at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:805) 

Répondre

5

a trouvé le problème. Le constructeur a accepté (String, int) lorsqu'il avait besoin de (String, long).

0

Suivez-moi

public Company(String name, int iva, String businessArea, String coreBusiness) { 
    this.name = name; 
    this.iva = iva; 
    this.businessArea = businessArea; 
    this.coreBusiness = coreBusiness; 
    } 

Query query = session.createQuery("select new Company (name, iva, businessArea, coreBusiness) from Company"); 


obs : org hibernate