今天使用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查询语句把结果转换成实体时候,要确保属性个数和名称,与查询语句的列一模一样对应。