由于最近要将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底层查询时候就可以正常查询。