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

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

使用 Java 连接 SQL Server 数据库,需要使用 Microsoft JDBC 驱动。您需要下载该驱动并将其添加到您的 Java 项目中。然后,您可以使用 JDBC API 建立与 SQL Server 的连接,并执行各种数据库操作,如查询和更新。 以下是一个简单的示例代码: ``` import java.sql.*; public class Main { static final String JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; static final String DB_URL = "jdbc:sqlserver://<hostname>:<port>;databaseName=<database>"; static final String USER = "<username>"; static final String PASS = "<password>"; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try { Class.forName(JDBC_DRIVER); conn = DriverManager.getConnection(DB_URL, USER, PASS); stmt = conn.createStatement(); String sql; sql = "SELECT * FROM <tablename>"; ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { // Retrieve data by column name int id = rs.getInt("<column1>"); String name = rs.getString("<column2>"); // Display values System.out.print("ID: " + id); System.out.println(", Name: " + name); } rs.close(); stmt.close(); conn.close(); } catch (SQLException se) { // Handle errors for JDBC se.printStackTrace(); } catch (Exception e) { // Handle errors for Class.forName e.printStackTrace(); } finally { // finally block used to close resources try { if (stmt != null) stmt.close(); } catch (SQLException se2) { } try { if (conn != null) conn.close(); } catch (SQLException se) { se.printStackTrace(); } } } } ``` 请注意,在上面的代码中,您需要替换 `<hostname>`,`<port>`,`<database>`,`<username>`,`<password>`,`<tablename>` 和 `<column1>`,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值