SELEZIONA NUOVO in JPQL
Domanda
Sto riscontrando un problema con una query SELEZIONA NUOVO.
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();
Ricevo il seguente stacktrace quando provo a eseguire questa query. RangeStats ha metodi pubblici, l'FQN è preciso, infatti RangeStats risiede nello stesso pacchetto della classe fare la query. Ho già fatto query su ODStat, quindi sono anche sicuro che a.folderName e a.hits siano OK.
Sto sviluppando con RAD 7.5, WAS 7, OpenJPA 1.2.1, MS SQL JDBC Driver 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)
Soluzione
Trovato il problema.
Il costruttore ha accettato (String, int)
quando era necessario (String, long)
.
Altri suggerimenti
Seguimi
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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow