標籤:
項目環境: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別名問題