2011-12-21 57 views
1

JPA中有一種將使用createNativeQuery將隨機選擇子句值轉換爲域對象的方法。域對象沒有被管理jpa將標量值從原生sql轉換爲實體

我有以下SQL查詢

select name, count(*) as cnt, sum(average_events)/count(*) as avg_events from (complex subquery) 

我想要的值A,B,C轉換成域對象有三個實例變量a,b和c。該域對象不由JPA管理,因此沒有@Entity並且沒有相應的表。

目前我正在做以下工作,它將返回一個對象列表。

Query query = objectManager.getEntityManager().createNativeQuery(sqlStr); 
List resultList = query.getResultList(); 

回答

5

使用此語法:

SELECT new foo.MyCustomObject(a, b, c) FROM ... 

哪裏MyCustomObject是相匹配的consdtructor任何類:

public class MyCustomObject { 
    private final String name; 
    private final int cnt; 
    private final float avg; 
    public MyCustomObject(String name, int cnt, float avg) { 
    this.name = name; 
    this.cnt = cnt; 
    this.avg = avg; 
    } 
    //...getters 
} 

斯卡拉獎金:等價類:

class MyCustomObject(name: String, cnt: Int, avg: Float) 
//no, actually that's it 
+0

我不確定如果我得到了....我已更新問題 – user373201 2011-12-21 18:42:34

+0

@ user373201:你試過了嗎? 'SELECT new'語法將爲您創建一個對象並調用指定的構造函數。這意味着'query.getResultList()'將返回一個'List '而不是'List '。另外'MyCustomObject'可以是任何具有匹配構造函數的對象。我更新了'MyCustomObject'的字段名稱,以便它們符合查詢中使用的命名。 – 2011-12-21 18:49:44

2

只是傳遞中「resultCl屁股「createNativeQuery調用。當然可以在DataNucleus JPA中使用。

+0

true,也適用於Hibernate,並且不需要SELECT NEW()和構造函數所需的附加樣板代碼... 請參閱http://www.oracle.com/technetwork/articles/中的「原生SQL查詢」瓦西里耶夫-JPQL-087123.html – Gregor 2012-01-30 13:51:35