簡體   English   中英

Hibernate - 如何在不映射到特定類的情況下執行命名本機查詢

[英]Hibernate - How to execute named native query without mapping to a specific class

我有一個非常復雜的查詢,不會轉換為HQL,所以我必須使用SQL。 我將查詢放入NamedNativeQuery注釋中。 它“應該”返回兩個值的列表( List<Object[2]> )。 當我嘗試運行時,會話無法加載查詢,因為我沒有定義映射或結果類。 我無法創建一個簡單的類來映射這些值,因為注釋必須放在特定的DAO項目中,並且使用查詢的代碼存在於自己的項目中。 (DAO項目更通用,項目中的實體直接映射到我們數據庫中的表。我不能在這個項目中創建一個小類來映射到我的查詢結果,因為它不適合這個項目的模式)

有沒有辦法讓我將查詢結果映射到更通用的類,或者甚至更好的是我有一些方法可以讓我只需要一個List<Object[]>而無需映射任何特定的東西? 當我想要做的就是執行查詢並將結果作為數組返回時,Hibernate必須以這種特殊方式工作,這是非常令人沮喪的。

這是我用於在List<Object[]>存儲SQL查詢結果的代碼。 也許你可以根據自己的需要調整它:

    public List<Object[]> executeSelectQuery(String sqlQuery) {

       List<Object[]> cleanedResults = new ArrayList<Object[]>();

       SQLQuery query = sessionFactory.getCurrentSession().createSQLQuery(sqlQuery);
       List<Object[]> hibernateResults = query.list();

       // Hibernate does not return always a List<Object[]>, but a list of strings or integers, so it is necessary to check the returned values

       if (!hibernateResults.isEmpty()) {
           if (hibernateResults.get(0) instanceof Object[]) {
               cleanedResults = hibernateResults;
           } else {
               Object[] row;
               // Use a 'for' because 'foreach' sometimes has casting exceptions converting to object
               for (int i = 0; i < hibernateResults.size(); i++) {
                  row = new Object[1];
                  row[0] = hibernateResults.get(i);
                  cleanedResults.add(row);
               }
           }
        }

        return cleanedResults;
    }

NamedNativeQuery支持附加注釋,允許您將結果映射到POJO:

@SqlResultSetMapping(name="MyResult.Mapping", entities = {
    @EntityResult(entityClass=MyResult.class, fields = {
        @FieldResult(name="email", column="email"),
        @FieldResult(name="name", column="name")
    })
})

然后將resultSetMapping="MyResult.Mapping"添加到NamedNativeQuery注釋中。

我最終沒有使用NamedNativeQueries,因為它們不適合我。 相反,我只使用帶有常量字符串的session.createSQLQuery ,它起作用了。

我可能沒有正確地說出我的問題。 我無法使用@SqlResultSetMapping因為根據我正在使用的代碼的結構,我沒有要映射到的任何類。 我的查詢必須List<Object[]>結果出現,並且沒有辦法使用NamedNativeQueries,因為Hibernate不支持它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM