`

(转)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或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

 

 

REFS: http://blog.itpub.net/90618/viewspace-776511/
            http://blog.csdn.net/renminzdb/article/details/43306749
            http://blog.csdn.net/dyb2010fly/article/details/42235515
  
分享到:
评论

相关推荐

    Hibernate SQLQuery 本地查询

    在Java的持久化框架Hibernate中,SQLQuery是用于执行自定义SQL语句的重要工具,它允许开发者绕过ORM(对象关系映射)的抽象层,直接与数据库进行交互。这篇博客"Hibernate SQLQuery 本地查询"可能详细讲解了如何利用...

    Hibernate SQLQuery执行原生SQL.docx

    在Java的Hibernate框架中,有时候我们需要执行自定义的SQL查询以获取特定的数据,这时就可以使用SQLQuery接口。本文将深入探讨Hibernate如何通过SQLQuery接口执行原生SQL查询,并展示如何处理查询结果。 一、创建...

    hibernate sql query.pdf

    hibernate sql hqlsql

    hibernate和MySQL的jar

    标题中的“hibernate和MySQL的jar”指的是Hibernate ORM框架与MySQL数据库之间的连接库。Hibernate是一种流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来操作数据库,而无需直接编写SQL...

    Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法

    ### Hibernate SQLQuery 查询Oracle char类型结果为一个字符的解决方法 在使用Hibernate框架结合Oracle数据库进行数据查询时,经常会遇到一个问题:当查询的结果集中包含char类型的字段时,Hibernate可能会将其映射...

    spring3.0+hibernate3.3+mysql8.0

    在本项目中,我们关注的是一个经典的Java Web开发技术栈:Spring 3.0、Hibernate 3.3以及MySQL 8.0的整合。这个组合是企业级应用中常见的技术选型,它们各自承担着不同的职责,共同构建了一个强大、灵活且可扩展的...

    Hibernate+本地SQL查询SQLQuery宣贯.pdf

    在某些情况下,开发者可能需要使用原生SQL查询来执行特定的数据库操作,这时就可以利用Hibernate的SQLQuery功能。本文将详细讲解如何使用Hibernate的SQLQuery进行本地SQL查询。 首先,创建SQLQuery实例是通过...

    解决Hibernate SQL Query Cache的一个可靠性问题(附源码)

    fix包 博文链接:https://raymondhekk.iteye.com/blog/250427

    Hibernate5 + Mysql实现Demo源码

    - **Criteria API/Query API**:提供动态查询方式,无需编写SQL,更符合面向对象的思想。 5. **操作步骤** - **持久化对象**:通过`Session.save()`或`Session.persist()`方法将对象保存到数据库。 - **检索对象...

    hibernate3+mysql简单学习实例.rar

    6. **HQL(Hibernate Query Language)**: HQL是Hibernate的查询语言,类似于SQL,但更面向对象。在示例中,你可能会看到如何使用HQL进行复杂的查询操作。 7. **事务管理(Transaction Management)**: Hibernate...

    Hibernate中Sql语句

    在Java开发中,Hibernate作为一个非常流行的ORM框架,提供了多种查询方式,其中就包括了HQL(Hibernate Query Language)和原生SQL查询。本文将针对给定代码片段中的核心知识点——如何在Hibernate中使用原生SQL而非...

    hibernate3.2+mysql+log4j

    【hibernate3.2+mysql+log4j】是一个经典的Java开发组合,常用于构建基于JDBC的持久层框架,结合关系型数据库MySQL和日志管理库log4j。这个压缩包可能包含了运行一个使用Hibernate 3.2、MySQL数据库和log4j日志系统...

    SpringBoot+hibernate+mysql+sqlserver双数据源

    本项目"SpringBoot+Hibernate+MySQL+SQLServer双数据源"正为此目的设计,它利用SpringBoot的灵活性和便利性,结合Hibernate的ORM能力,实现了对MySQL和SQLServer两种主流数据库的支持,为数据迁移、读写分离、高可用...

    hibernate4+mysql测试相关jar包

    本资源“hibernate4+mysql测试相关jar包”是针对使用Hibernate 4版本进行MySQL数据库操作的开发者准备的,包含了进行基本的增、删、查、改(CRUD)操作所需的库文件。 首先,让我们深入了解一下Hibernate 4。...

    Hibernate中连接MySql所需的jar包

    3. Query和Criteria:这些是执行SQL查询的API,允许开发者通过HQL(Hibernate查询语言)或Criteria API来检索数据。 接下来,`mysqljdbc.jar`(通常被称为`mysql-connector-java`)是MySQL官方提供的Java数据库连接...

    spring+hibernate 分页 +mysql

    5. **分页查询**: 在Hibernate的实现中,我们可以使用Criteria API或者HQL(Hibernate Query Language)配合Pageable接口进行分页查询。 6. **返回结果**: 将Page对象转换为前端需要的格式,如包含总页数、当前页...

    hibernate执行原生sql语句

    Hibernate 提供了多种方式来执行原生 SQL 语句,其中之一是使用 `Session.createSQLQuery()` 方法,该方法返回一个 `SQLQuery` 对象,该对象提供了执行原生 SQL 语句的方法。 例如,我们可以使用以下代码来执行一个...

    Hibernate+本地SQL查询SQLQuery.pdf

    《Hibernate中的本地SQL查询SQLQuery》 在Java的持久化框架Hibernate中,有时我们需要使用原生的SQL查询来实现特定的数据库操作,这时就需要利用到SQLQuery接口。本篇文章将详细解析如何使用Hibernate的SQLQuery来...

    hibernate将本地SQL查询结果封装成对象

    首先,本地SQL查询(Native SQL)是指直接在Hibernate中使用原生的SQL语句进行查询,而不是使用HQL(Hibernate Query Language)。这允许开发者充分利用SQL的功能,比如进行复杂的统计计算或者处理特定数据库的特性...

Global site tag (gtag.js) - Google Analytics