(转)hibernate sqlQuery mysql别名问题

项目环境: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的原因所在!

代码部分:

 

[java]  view plain  copy
 
  1.        SQLQuery query = createSQLQuery(orderSql, values);  
  2. long totalCount = countSqlResult(sql, values);  
  3. page.setTotalItems(totalCount);  
  4. setPageParameterToSqlQuery(query, page);  
  5. List result = query.setResultTransformer(Transformers.aliasToBean(cl)).list();  
  6. page.setResult(result);  

 

 

 

平台输出:

 

[sql]  view plain  copy
 
  1. select  
  2.        l.id,  
  3.        userId,  
  4.        u.account as `userAccount`,  
  5.        ip,  
  6.        ipAddr,  
  7.        loginTime   
  8.    from  
  9.        t_loginlog l   
  10.    left join  
  11.        t_user u   
  12.            on l.userId = u.id   
  13.    where  
  14.        1=1 limit ?  

 

 

 

 

[java]  view plain  copy
 
  1. [2015-01-30 14:27:29,031][ERROR][http-8080-1] (JDBCExceptionReporter.java:234) - Column 'account' not found.  
  2. 2015-1-30 14:27:29 org.apache.catalina.core.StandardWrapperValve invoke  
  3. 严重: Servlet.service() for servlet ishare threw exception  
  4. java.sql.SQLException: Column 'account' not found.  
  5.     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)  
  6.     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)  
  7.     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975)  
  8.     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920)  
  9.     at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1171)  
  10.     at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5737)  
  11.     at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:263)  
  12.     at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:263)  
  13.     at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$2.doExtract(VarcharTypeDescriptor.java:61)  
  14.     at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:64)  
  15.     at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253)  
  16.     at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:249)  
  17.     at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:234)  
  18.     at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.extract(CustomLoader.java:505)  
  19.     at org.hibernate.loader.custom.CustomLoader$ResultRowProcessor.buildResultRow(CustomLoader.java:451)  
  20.     at org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow(CustomLoader.java:348)  
  21.     at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:639)  
  22.     at org.hibernate.loader.Loader.doQuery(Loader.java:829)  
  23.     at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)  
  24.     at org.hibernate.loader.Loader.doList(Loader.java:2533)  
  25.     at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)  
  26.     at org.hibernate.loader.Loader.list(Loader.java:2271)  
  27.     at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316)  
  28.     at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842)  
  29.     at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)  
  30.     at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157)  
  31.     at com.coolsoul.framework.orm.hibernate.HibernateDao.findSqlPage(HibernateDao.java:90)  
  32.     at com.coolsoul.ishare.loginLog.service.LoginLogService.findPageList(LoginLogService.java:54)  
  33.     at com.coolsoul.ishare.loginLog.service.LoginLogService
    FastClassByCGLIB
    fb9ca761.invoke(<generated>)  
  34.     at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)  
  35.     at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:688)  
  36.     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)  
  37.     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)  
  38.     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  
  39.     at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621)  
  40.     at com.coolsoul.ishare.loginLog.service.LoginLogService
    EnhancerByCGLIB
    5ea6d36b.findPageList(<generated>)  
  41.     at com.coolsoul.ishare.loginLog.controller.LoginLogController.queryList(LoginLogController.java:69)  
  42.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  43.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
  44.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  45.     at java.lang.reflect.Method.invoke(Method.java:597)  
  46.     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)  
  47.     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)  
  48.     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)  
  49.     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)  
  50.     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)  
  51.     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)  
  52.     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)  
  53.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)  
  54.     at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)  
  55.     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)  
  56.     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)  
  57.     at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)  
  58.     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)  
  59.     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)  
  60.     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)  
  61.     at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)  
  62.     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)  
  63.     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)  
  64.     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)  
  65.     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)  
  66.     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)  
  67.     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)  
  68.     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)  
  69.     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)  
  70.     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)  
  71.     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)  
  72.     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)  
  73.     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)  
  74.     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或gbkfalse   1.1g 
characterEncoding当useUnicode设置为true时,指定字符编码。比如可设置为gb2312或gbkfalse 1.1g 
autoReconnect当数据库连接异常中断时,是否自动重新连接false1.1
autoReconnectForPools是否使用针对数据库连接池的重连策略false3.1.3
failOverReadOnly自动重连成功后,连接是否设置为只读true3.0.12
maxReconnectsautoReconnect设置为true时,重试连接的次数31.1
initialTimeoutautoReconnect设置为true时,两次重连之间的时间间隔,单位:秒21.1
connectTimeout和数据库服务器建立socket连接时的超时,单位:毫秒,0表示永不超时,适用于JDK 1.4及更高版本03.0.1
socketTimeoutsocket操作(读写)超时,单位:毫秒。 0表示永不超时03.0.1

 

 

REFS: http://blog.itpub.net/90618/viewspace-776511/
            http://blog.csdn.net/renminzdb/article/details/43306749
            http://blog.csdn.net/dyb2010fly/article/details/42235515
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate是一个开源的Java持久化框架,它提供了对象-关系映射(ORM)的功能,可以方便地将Java对象映射到关系数据库中的表。通过Hibernate,我们可以使用面向对象的方式来操作数据库,而不需要编写大量的SQL语句。 在Hibernate中,我们可以使用HQL(Hibernate Query Language)来执行数据库操作,它类似于SQL语言,但更加面向对象。HQL允许我们使用实体类和属性名称来进行查询和更新操作。 除了HQL,Hibernate也支持使用本地SQL语句进行数据库操作。我们可以使用Hibernate提供的SQL查询功能,执行原生的SQL语句并获取结果。 下面是一个使用Hibernate执行SQL查询的示例: ```java // 创建Session对象 Session session = HibernateUtil.getSessionFactory().openSession(); // 创建原生SQL查询 String sqlQuery = "SELECT * FROM your_table"; SQLQuery query = session.createSQLQuery(sqlQuery); // 获取结果集 List<Object[]> rows = query.list(); for (Object[] row : rows) { // 处理结果集 // row[0]代表第一个列的值,row[1]代表第二个列的值,依此类推 } // 关闭Session session.close(); ``` 在上面的示例中,我们首先创建了一个Session对象,然后使用`createSQLQuery()`方法创建了一个原生SQL查询对象。我们可以通过调用`list()`方法执行查询并获取结果集。最后,记得关闭Session对象。 需要注意的是,使用原生SQL查询可能会使你的代码与特定的数据库厂商耦合,不够跨数据库。在实际开发中,建议尽量使用Hibernate提供的HQL查询,它更加灵活和可移植。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值