hibernate5 报错com.microsoft.sqlserver.jdbc.SQLServerException: 列名 XX 无效。

来源:互联网 发布:linux 模块查看 编辑:程序博客网 时间:2024/06/08 20:15

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

阅读全文
0 0
原创粉丝点击