[英]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.