项目环境:hibernate3.6.1 mysql5.7.3 驱动:MySQL-connector-Java-5.1.26
问题描述:项目是从一个sqlserver 数据库翻转到mysql数据库上的。通过sql查询,自动映射到对象上,但是总是报错。奇怪的问题:sql打印出来放到数据库客户端上
可以正常执行结果。但是sql就是查询不出来,报 Column 'account' not found. 这样的错。换过驱动,想过框架的调用方式,查询资料的时候,发现有人
说用query.addEntity("","").list() 可以解决问题,未做验证。因为不想花大力气从框架上变动。用驱动源码跟踪,发现原来,驱动根本就不识别别名。在查询
`userAccount`对应的值的时候,传到驱动的columnName 竟然是 “account”,这也是很多人在网上说的,如果sqlQuey 遇到两个表有同一个属性名,查询会
报错的bug的原因所在!
代码部分:
- SQLQuery query = createSQLQuery(orderSql, values);
- long totalCount = countSqlResult(sql, values);
- page.setTotalItems(totalCount);
- setPageParameterToSqlQuery(query, page);
- List result = query.setResultTransformer(Transformers.aliasToBean(cl)).list();
- page.setResult(result);
平台输出:
- select
- l.id,
- userId,
- u.account as `userAccount`,
- ip,
- ipAddr,
- loginTime
- from
- t_loginlog l
- left join
- t_user u
- on l.userId = u.id
- where
- 1=1 limit ?
- [2015-01-30 14:27:29,031][ERROR][http-8080-1] (JDBCExceptionReporter.java:234) - Column 'account' not found.
- 2015-1-30 14:27:29 org.apache.catalina.core.StandardWrapperValve invoke
- 严重: Servlet.service() for servlet ishare threw exception
- java.sql.SQLException: Column 'account' not found.
- at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
- at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
- at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)
- at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)
- at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1171)
- at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5737)
- at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:263)
- at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:263)
- at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$2.doExtract(VarcharTypeDescriptor.java:61)
- at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:64)
- at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253)
- at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:249)
- at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:234)
- at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.extract(CustomLoader.java:505)
- at org.hibernate.loader.custom.CustomLoader$ResultRowProcessor.buildResultRow(CustomLoader.java:451)
- at org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow(CustomLoader.java:348)
- at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:639)
- at org.hibernate.loader.Loader.doQuery(Loader.java:829)
- at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
- at org.hibernate.loader.Loader.doList(Loader.java:2533)
- at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
- at org.hibernate.loader.Loader.list(Loader.java:2271)
- at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316)
- at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842)
- at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
- at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157)
- at com.coolsoul.framework.orm.hibernate.HibernateDao.findSqlPage(HibernateDao.java:90)
- at com.coolsoul.ishare.loginLog.service.LoginLogService.findPageList(LoginLogService.java:54)
-
at com.coolsoul.ishare.loginLog.service.LoginLogService
FastClassByCGLIBfb9ca761.invoke(<generated>)
- at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
- at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:688)
- at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
- at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
- at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
- at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621)
-
at com.coolsoul.ishare.loginLog.service.LoginLogService
EnhancerByCGLIB5ea6d36b.findPageList(<generated>)
- at com.coolsoul.ishare.loginLog.controller.LoginLogController.queryList(LoginLogController.java:69)
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
- at java.lang.reflect.Method.invoke(Method.java:597)
- at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
- at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
- at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
- at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
- at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
- at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
- at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
- at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
- at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
- at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
- at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
- at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
- at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
- at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
- at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
- at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
- at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
- at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
- at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
- at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
- at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
- at java.lang.Thread.run(Thread.java:662)
解救方法:
困扰了我很久 ,找了很多资料,问题很简单,就是驱动不支持别名的问题,这里记录下,为后来人造桥!!! 在连接mysql数据库的时候添加 useOldAliasMetadataBehavior=true 这个参数!!!!
jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/db?useUnicode\=true&characterEncoding\=utf8&useOldAliasMetadataBehavior=true
常用的几个较为重要的参数:
参数名称 | 参数说明 | 缺省值 | 最低版本要求 |
user | 数据库用户名(用于连接数据库) | 所有版本 | |
password | 用户密码(用于连接数据库) | 所有版本 | |
useUnicode | 是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk | false | 1.1g |
characterEncoding | 当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbk | false | 1.1g |
autoReconnect | 当数据库连接异常中断时,是否自动重新连接 | false | 1.1 |
autoReconnectForPools | 是否使用针对数据库连接池的重连策略 | false | 3.1.3 |
failOverReadOnly | 自动重连成功后,连接是否设置为只读 | true | 3.0.12 |
maxReconnects | autoReconnect设置为true时,重试连接的次数 | 3 | 1.1 |
initialTimeout | autoReconnect设置为true时,两次重连之间的时间间隔,单位:秒 | 2 | 1.1 |
connectTimeout | 和数据库服务器建立socket连接时的超时,单位:毫秒,0表示永不超时,适用于JDK 1.4及更高版本 | 0 | 3.0.1 |
socketTimeout | socket操作(读写)超时,单位:毫秒。 0表示永不超时 | 0 | 3.0.1 |
相关推荐
在Java的持久化框架Hibernate中,SQLQuery是用于执行自定义SQL语句的重要工具,它允许开发者绕过ORM(对象关系映射)的抽象层,直接与数据库进行交互。这篇博客"Hibernate SQLQuery 本地查询"可能详细讲解了如何利用...
在Java的Hibernate框架中,有时候我们需要执行自定义的SQL查询以获取特定的数据,这时就可以使用SQLQuery接口。本文将深入探讨Hibernate如何通过SQLQuery接口执行原生SQL查询,并展示如何处理查询结果。 一、创建...
hibernate sql hqlsql
标题中的“hibernate和MySQL的jar”指的是Hibernate ORM框架与MySQL数据库之间的连接库。Hibernate是一种流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来操作数据库,而无需直接编写SQL...
### Hibernate SQLQuery 查询Oracle char类型结果为一个字符的解决方法 在使用Hibernate框架结合Oracle数据库进行数据查询时,经常会遇到一个问题:当查询的结果集中包含char类型的字段时,Hibernate可能会将其映射...
在本项目中,我们关注的是一个经典的Java Web开发技术栈:Spring 3.0、Hibernate 3.3以及MySQL 8.0的整合。这个组合是企业级应用中常见的技术选型,它们各自承担着不同的职责,共同构建了一个强大、灵活且可扩展的...
在某些情况下,开发者可能需要使用原生SQL查询来执行特定的数据库操作,这时就可以利用Hibernate的SQLQuery功能。本文将详细讲解如何使用Hibernate的SQLQuery进行本地SQL查询。 首先,创建SQLQuery实例是通过...
fix包 博文链接:https://raymondhekk.iteye.com/blog/250427
- **Criteria API/Query API**:提供动态查询方式,无需编写SQL,更符合面向对象的思想。 5. **操作步骤** - **持久化对象**:通过`Session.save()`或`Session.persist()`方法将对象保存到数据库。 - **检索对象...
6. **HQL(Hibernate Query Language)**: HQL是Hibernate的查询语言,类似于SQL,但更面向对象。在示例中,你可能会看到如何使用HQL进行复杂的查询操作。 7. **事务管理(Transaction Management)**: Hibernate...
在Java开发中,Hibernate作为一个非常流行的ORM框架,提供了多种查询方式,其中就包括了HQL(Hibernate Query Language)和原生SQL查询。本文将针对给定代码片段中的核心知识点——如何在Hibernate中使用原生SQL而非...
【hibernate3.2+mysql+log4j】是一个经典的Java开发组合,常用于构建基于JDBC的持久层框架,结合关系型数据库MySQL和日志管理库log4j。这个压缩包可能包含了运行一个使用Hibernate 3.2、MySQL数据库和log4j日志系统...
本项目"SpringBoot+Hibernate+MySQL+SQLServer双数据源"正为此目的设计,它利用SpringBoot的灵活性和便利性,结合Hibernate的ORM能力,实现了对MySQL和SQLServer两种主流数据库的支持,为数据迁移、读写分离、高可用...
本资源“hibernate4+mysql测试相关jar包”是针对使用Hibernate 4版本进行MySQL数据库操作的开发者准备的,包含了进行基本的增、删、查、改(CRUD)操作所需的库文件。 首先,让我们深入了解一下Hibernate 4。...
3. Query和Criteria:这些是执行SQL查询的API,允许开发者通过HQL(Hibernate查询语言)或Criteria API来检索数据。 接下来,`mysqljdbc.jar`(通常被称为`mysql-connector-java`)是MySQL官方提供的Java数据库连接...
5. **分页查询**: 在Hibernate的实现中,我们可以使用Criteria API或者HQL(Hibernate Query Language)配合Pageable接口进行分页查询。 6. **返回结果**: 将Page对象转换为前端需要的格式,如包含总页数、当前页...
Hibernate 提供了多种方式来执行原生 SQL 语句,其中之一是使用 `Session.createSQLQuery()` 方法,该方法返回一个 `SQLQuery` 对象,该对象提供了执行原生 SQL 语句的方法。 例如,我们可以使用以下代码来执行一个...
《Hibernate中的本地SQL查询SQLQuery》 在Java的持久化框架Hibernate中,有时我们需要使用原生的SQL查询来实现特定的数据库操作,这时就需要利用到SQLQuery接口。本篇文章将详细解析如何使用Hibernate的SQLQuery来...
首先,本地SQL查询(Native SQL)是指直接在Hibernate中使用原生的SQL语句进行查询,而不是使用HQL(Hibernate Query Language)。这允许开发者充分利用SQL的功能,比如进行复杂的统计计算或者处理特定数据库的特性...