今天使用hibernateTemplate.executeWithNativeSession執行sql查詢語句把結果轉換成實體時候,發現除了第一頁請求查詢正常,請求其他頁面時候報錯com.microsoft.sqlserver.jdbc.SQLServerException: 列名 id 無效
1 錯誤描述:
2 報錯出現場景:
使用hibernateTemplate.executeWithNativeSession執行sql查詢語句把結果轉換成實體時候
List<BbsTopicInfo> list = hibernateTemplate.executeWithNativeSession(
new HibernateCallback<List<BbsTopicInfo>>() {
@Override
public List<BbsTopicInfo> doInHibernate(Session session) throws HibernateException {
SQLQuery sqlQuery = session.createSQLQuery(sql);
// 添加要查詢字段 數據庫字段和實體類字段對應起來
AddScalar.addSclar(sqlQuery, BbsTopicInfo.class);
// 把結果轉換成實體
sqlQuery.setResultTransformer(Transformers.aliasToBean(BbsTopicInfo.class));
sqlQuery.setFirstResult(firstResult);
sqlQuery.setMaxResults(pageSize);
return sqlQuery.list();
}
});
3 分析可能原因: 根本原因是結果集中找不到與實體類屬性名稱id的列
3.1 可能實體類有id屬性,但查詢結果中沒有id屬性;
此時去掉實體類中多餘的屬性即可
3.2可能實體類有id屬性,但hibernate把查詢結果把id屬性名稱解析爲其他名稱,如page0_;
測此時給查詢語句每列加AS改變列名,列名與實體類屬性一樣
sql部分語句:
hibernate打印sql語句
修改後的sql語句,加了AS屬性
hibernate最終打印 sql語句
4 結論:
使用hibernateTemplate.executeWithNativeSession執行sql查詢語句把結果轉換成實體時候,要確保屬性個數和名稱,與查詢語句的列一模一樣對應。