2009-10-29 46 views
4

我遇到了SELECT NEW查詢的問題。在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(); 

當我嘗試運行此查詢時,收到以下stacktraceRangeStats確實具有公共方法,但FQN是準確的,實際上RangeStats與進行查詢的類位於同一個包中。我之前在ODStat上做過查詢,所以我也確信a.folderName和a.hits是可以的。

我正在開發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) 

回答

5

發現問題。 當需要(String, long)時,構造函數接受(String, int)

0

跟着我

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