hibernate sqlQuery mysql別名問題

來源:互聯網
上載者:User

標籤:



項目環境: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 exceptionjava.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$$FastClassByCGLIB$$fb9ca761.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$$EnhancerByCGLIB$$5ea6d36b.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




hibernate sqlQuery mysql別名問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.