2014-01-31 58 views
2

我使用OpenJPA的2.1.1 WebSphere Application Server上8JPA 2構造表達不能使用構造

我想用構造函數表達式創建SELECT查詢對象:

String queryString = "SELECT NEW mypackage.StatisticDataObject(c.source, " 
    + "SUM(CASE WHEN (c.validTo <= CURRENT_TIMESTAMP AND c.expireNoProblem LIKE 'N') THEN 1 ELSE 0 END), " 
    + "SUM(CASE WHEN (c.validTo <= CURRENT_TIMESTAMP AND c.expireNoProblem LIKE 'Y') THEN 1 ELSE 0 END), " 
    + "SUM(CASE WHEN (c.validTo > :timestamp30) THEN 1 ELSE 0 END), " 
    + "SUM(CASE WHEN (c.validTo > :timestamp10 AND c.validTo <= :timestamp30) THEN 1 ELSE 0 END), " 
    + "SUM(CASE WHEN (c.validTo > CURRENT_TIMESTAMP AND c.validTo <= :timestamp10) THEN 1 ELSE 0 END))" 
    + "FROM MYTABLE c GROUP BY c.source"; 
TypedQuery<StatisticDataObject> q = em.createQuery(queryString, 
       StatisticDataObject.class); 
q.setParameter("timestamp30", getTimestampIn(30)); 
q.setParameter("timestamp10", getTimestampIn(10)); 

構造:

public StatisticDataObject(String name, Integer expired, 
     Integer expiredButOK, Integer expireIn10Days, Integer expireIn30Days, 
     Integer expireGT30Days) { 
    this.name = name; 
    this.expired = expired; 
    this.expiredButOK = expiredButOK; 
    this.expireIn10Days = expireIn10Days; 
    this.expireIn30Days = expireIn30Days; 
    this.expireGT30Days = expireGT30Days; 
} 

但我得到以下例外:

Caused by: <openjpa-2.1.1-SNAPSHOT-r422266:1141200 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Query "SELECT NEW mypackage StatisticDataObject(c.source, ... at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:872) 
    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:794) 
    at org.apache.openjpa.kernel.DelegatingQuery.execute(DelegatingQuery.java:542) 
    at org.apache.openjpa.persistence.QueryImpl.execute(QueryImpl.java:315) 
    at org.apache.openjpa.persistence.QueryImpl.getResultList(QueryImpl.java:331) 
... 
Caused by: java.lang.RuntimeException: Es wurde kein Konstruktor für "class mypackage.StatisticDataObject" mit den Argumenttypen "[class java.lang.String, class java.lang.String, class java.lang.String, class java.lang.String, class java.lang.String, class java.lang.String]" gefunden, um die Daten einzutragen. 
// ENGLISH Translation: Caused by: java.lang.RuntimeException: There is no constructor "class mypackage.StatisticDataObject" with argument type "[class java.lang.String, class java.lang.String, class java.lang.String, class java.lang.String, class java.lang.String, class java.lang.String]". 
    at org.apache.openjpa.kernel.FillStrategy$NewInstance.findConstructor(FillStrategy.java:139) 
    at org.apache.openjpa.kernel.FillStrategy$NewInstance.fill(FillStrategy.java:144) 
    at org.apache.openjpa.kernel.ResultShape.pack(ResultShape.java:362) 
    at org.apache.openjpa.kernel.ResultShapePacker.pack(ResultShapePacker.java:48) 
    at org.apache.openjpa.kernel.QueryImpl$PackingResultObjectProvider.getResultObject(QueryImpl.java:2082) 
    at org.apache.openjpa.lib.rop.EagerResultList.<init>(EagerResultList.java:36) 
    at org.apache.openjpa.kernel.QueryImpl.toResult(QueryImpl.java:1251) 
    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1007) 
    at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:863) 
    ... 84 more 

如果我運行沒有NEW mypackage.StatisticDataObject()的查詢,它通過使用Object []工作。另外,對象的類[1-5](.getClass())是Integer。

那麼,爲什麼JPA在使用構造函數表達式時從SUM()而不是Integer返回String?

回答

0

在您的構造函數中,請計算您將應用的字段類型的狀態SUM需要爲數字,並且結果類型必須與字段類型相對應。例如,如果Double字段相加,則結果將以Double形式返回。如果Long字段類型相加,則響應將作爲Long返回。

這是問題的根源,SUM不返回一個Integer類型。

+0

這就是對,它似乎SUM返回一個字符串。但爲什麼? – veote