【问题标题】:SELECT NEW in JPQL在 JPQL 中选择新的
【发布时间】:2010-12-11 05:53:49
【问题描述】:

我遇到了 SELECT NEW 查询的问题。

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)

【问题讨论】:

    标签: java jpa jpql openjpa


    【解决方案1】:

    发现问题。 构造函数在需要 (String, long) 时接受了 (String, int)

    【讨论】:

      【解决方案2】:

      跟我来

       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
      

      【讨论】:

        猜你喜欢
        • 2011-10-02
        • 2021-08-19
        • 1970-01-01
        • 2013-08-29
        • 2010-11-15
        • 2011-10-11
        • 2012-05-06
        • 2014-03-22
        • 2012-09-07
        相关资源
        最近更新 更多