hibernate 或者Jpa 報錯 java.sql.SQLException: Column ‘列名’ not found 解決

今天遇到一個很奇怪的問題,就是某一段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  帶上別名就報錯了

相關文章
相關標籤/搜索