今天遇到一個很奇怪的問題,就是某一段SQL 在個人電腦裏面執行的時候報錯了。雖然這段SQL是原生的複雜SQL。java
可是在 測試環境那邊沒有問題啊。並且我看了一下SVN的記錄,發現當前版本也沒有人改動啊!!怎麼就出現了這個問題?mysql
先上異常把spring
jpa Column 'totalWeight' not found.
反正 出現來堆的SQL最好爆了這個。sql
由於這個是 分頁查詢,發現是在 查詢總記錄數的時候,沒有報錯。報錯的是接下來的 limit分頁查詢記錄。函數
由於個人本地項目配置了 p6spy 所以能夠看到發給MYSQL的 原生SQL測試
SELECT a.id, a.createtime,a.goods_amount, a.order_id,a.order_status,a.totalPrice,a.ziti_name, a.ziti_mobile,b.store_name, b.store_telephone, b.store_ower,c.userName, d.en_name,d.en_ceo,d.en_address,w.total_weight as total_goods_weight, a.borrow_status FROM gwqmshop_order a left join gwqmshop_store b on b.id=a.store_id left join gwqmshop_user c on c.id =a.user_id left join (SELECT of_id, SUM(t.goods_weight*t.count) as total_weight FROM gwqmshop_goods_shopcart t group by t.of_id) w on w.of_id=a.id left join gwqmshop_user_enterprise d on d.user_id=a.user_id where 1=1 and a.disabled=0 order by a.createtime desc limit 12;
就是上面這樣的。而後我把它 拿過去mysql 那邊執行了一下, 發現沒有問題啊!!!url
也就是說,問題極可能是 在JPA解析結果集的時候報錯的。但是看起來怎麼會出現問題呢?.net
還找不到字段? 並且個人是原生 SQL啊,沒有使用 HQL的hibernate
而後我百度了一下 unix
參考 https://blog.csdn.net/love_moon821/article/details/80015851
說是 不支持 別名? 確實有了 別名。
我開始是由於是 left join 級聯的別名問題
(SELECT of_id,
SUM(t.goods_weight*t.count),t.goods_weight,t.count as total_weight FROM gwqmshop_goods_shopcart t
group by
t.of_id)
但是 這個是 子表,並且是 分組的,必須有啊!!!
並且必須這些寫啊!!! 因而我試着把上面的
w.total_weight as total_goods_weight 這個 別名去掉
去掉以後, 跑起來項目,結果沒有問題了。
也是服了,我以爲JPA對於HQL不能夠有別名還能夠理解,可是是原生SQL 仍是不行。
並且是 解析結果集的時候問題,通常出現SQL異常不是 MYSQL那邊出錯致使的嗎。
算是 JPA那些的坑吧
相似的錯誤
org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute query; SQL [select oi.texture as goods_outurl, sum(oi.num) as total_count, sum(oi.total_weight) as total_weight, sum(o.total_price) as total_amount from v_all_order o join v_all_order_item oi on oi.order_id=o.id where o.user_id = 777 and o.order_status>0 and unix_timestamp(o.createtime) >= unix_timestamp('2019-01-01 00:00:00') and unix_timestamp(o.createtime) <= unix_timestamp('2019-12-31 23:59:59') group by oi.texture order by oi.texture ]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:635) Caused by: org.hibernate.exception.SQLGrammarException: could not execute query at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.loader.Loader.doList(Loader.java:2231) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125) at org.hibernate.loader.Loader.list(Loader.java:2120) at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:312) at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1722) at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165) at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:175) at com.gwqm.base.basedao.GenericEntityDao$7.doInJpa(GenericEntityDao.java:293) at org.springframework.orm.jpa.JpaTemplate.execute(JpaTemplate.java:187) ... 127 more Caused by: java.sql.SQLException: Column 'texture' not found.
可是我發現了一個問題,就是 若是 使用了SQL 函數,帶上別名是 支持的,不會報錯
select oi.texture , sum(oi.num) as total_count, sum(oi.total_weight) as total_weight, sum(o.total_price) as total_amount from v_all_order o join v_all_order_item oi on oi.order_id=o.id where o.user_id = 777 and o.order_status>0 and unix_timestamp(o.createtime) >= unix_timestamp('2019-01-01 00:00:00') and unix_timestamp(o.createtime) <= unix_timestamp('2019-12-31 23:59:59') group by oi.texture order by oi.texture ;
好比 帶上函數 sum ,count 帶上別名是沒有報錯的,
可是 texture 帶上別名就報錯了