由於最近要將JPA的數據源使用sqlserver。在成功配置完成之後,在service層調用底層的Dao層接口實現時候,出現錯誤:
“10”附近出現語法錯誤。出錯肯定是在sqlserver數據查詢sql語句有問題,且是語法錯誤。
解決思路:
A:由於JPA框架將底層Dao的數據庫操作語句都封裝了。在通常情況下是看不到sql語句的。所以,在基於JPA配置數據庫文件中進行sql語句輸出設置。
我的是在jdbc.properties文件下,設置:
jpa.showSql=true #設置JPA在底層執行數據庫操作進行語句輸出。
B:然後就重新執行程序,在控制檯將改sql語句提取出來,在sqlserver客戶端中執行。結果依然是"10"附近有語法錯誤。所以,現在就需要觀察該sql語句的語法。
該sql語句如下:
select erpinvento0_.CINVCODE as CINVCODE1_31_,
erpinvento0_.I_ID as I2_31_,
erpinvento0_.BACCESSARY as BACCESSA3_31_,
erpinvento0_.BATOMODEL as BATOMODE4_31_,
erpinvento0_.BBARCODE as BBARCODE6_31_,
erpinvento0_.BBILLUNITE as BBILLUNI7_31_,
erpinvento0_.BBOMMAIN as BBOMMAIN8_31_,
erpinvento0_.BFREE2 as BFREE41_31_,
erpinvento0_.BFREE3 as BFREE42_31_,
erpinvento0_.BFREE4 as BFREE43_31_,
erpinvento0_.BFREE5 as BFREE44_31_,
erpinvento0_.bFree5 10 as bFree45_31_, ........
觀察該sql語句就會發現,在最後一行bFree5 10這裏多了個空格,從而造成sql語句語法錯誤。
C:現在知道這裏出現問題,那麼該sql的BFree5 10 對應於JPA實體映射中的屬性字段。那麼就是實體在映射到JPA過程中出現問題。那麼查看實體配置:
@Column(name = "BFREE5 10", precision = 22, scale = 0)
public BigDecimal getBfree10() {
return this.bfree10;
}
看到了實體在column註解上的name屬性配置中多了個空格,導致在映射到數據庫中生成查詢語句時候,就出現了A中的sql查詢,在"10"附近出現了語句錯誤。
最後,就要重新設置該column名字字段信息,正確匹配。在Dao底層查詢時候就可以正常查詢。