2017-06-16 53 views
5

考慮這個簡單的查詢:休眠:他們的別名抓取列

SELECT 1 as first, 2 as second

當使用Hibernate,我們就可以這樣做:

em.createNativeQuery(query).fetchResultList()

然而,似乎沒有獲取別名(或列名稱)的方式。這對於創建List<Map<String, Object>>非常有幫助,其中每個映射將與其別名一致,例如在這種情況下:[{first: 1, second: 2}]

有沒有辦法做到這一點?

回答

1

您可以使用ResultTransformer接口。實現自定義映射器以用別名映射值。 我這裏是https://vladmihalcea.com/why-you-should-use-the-hibernate-resulttransformer-to-customize-result-set-mappings/

與使用ResultTransformer你可以很容易定製的結果集類型,特別是如果你需要的別名

+0

這篇文章確實幫了我很大的忙 - 我以前試圖使用ResultTransformer而沒有效果。正是我需要的。 –

+0

也許你可以幫助這個:https://stackoverflow.com/questions/44585825/correct-cast-in-resulttransformer –

+0

使用對象包裝不是原語。你使用的是哪個數據庫?oracle,mysql,postgressql ...有些類型可能有問題 – xyz

2

我建議有點不同的方法,這可能滿足您的需求。

在JPA 2.1中有一個稱爲「結果集映射」的功能。

基本上,你必須定義一個POJO類將持有的結果值(所有值必須使用構造函數傳遞):

public class ResultClass{ 

    private String fieldOne; 
    private String fieldTwo; 

    public ResultClass(String fieldOne, String fieldTwo){ 
     this.fieldOne = fieldOne; 
     this.fieldTwo = fieldTwo; 
    } 
} 

然後,你必須聲明你的實體之一(映射不要緊上,它只是成爲一個declated @Entity):

@SqlResultSetMapping(name="ResultMapping", classes = { 
    @ConstructorResult(targetClass = ResultClass.class, 
    columns = {@ColumnResult(name="columnOne"), @ColumnResult(name="columnTwo")}) 
}) 

columnOnecolumnTwo是爲本地查詢的SELECT子句中聲明的別名。

終於在建立查詢使用:

List<ResultClass> results = em.createNativeQuery(query, "ResultMapping").getResultList(); 

在我看來,這是更優雅和「水平以上」解決方案,你是不是有一個通用的地圖重點工作/值對,但有一個具體的POJO課程。

+0

我不喜歡的是我必須在更多位置命名列:1.在類中,在映射和在查詢中。老實說,我想避免映射,以便直接在類上通過別名映射它。另外我不喜歡這個事實,即@ @ SqlResultSetMapping必須在完全不同的類上註釋。我覺得有趣的是'AliasToBeanConstructorResultTransformer',但它僅適用於條件查詢。 –