标签:
今天在查一个bug的时候,发现一个发现要查询的语句查询到不符合的数据。
@QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value = "true") }) @Query("select o from TerminalSoftware o where o.code=:code and :osVersion >= o.osMinimumVersion and o.status =2 order by o.releaseTime desc") Page<TerminalSoftware> findLatestVersionByPlatformResolutionOsVersion(@Param("code")String code, @Param("osVersion")String osVersion,Pageable pageable);
在这里查询应该排除掉那版本高于Version的数据
在测试多次后发现总是能取到该值。
于是我在用sql语句来模拟一下:
这段语句是想搜出CODE为IOS001,STATUS为2,最低版本(OS_MINIMUM_VERSION)不能超过8.4的数据
这样能把多于的一条数据查询到。
换一种写法:
果然,这样的话就无法搜索的到不想要的数据
,问题解决,皆大欢喜!!!
但是到了代码里面,有Hibernate封装的sql语句的时候
把OSVersion换成int,double,long,float等类型都会报同一个错误:
<Parameter value [8] did not match expected type [java.lang.String (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [8] did not match expected type [java.lang.String (n/a)]>
简单翻译一下就是【
<参数值[ 8 ]不符合预期的类型[ java.lang.string(N / A)];嵌套异常java.lang.illegalargumentexception:参数值[ 8 ]不符合预期的类型[ java.lang.string(N / A)] >
】
原来,在该bean里面已经定义了String类型了,如果想要改掉这个类型,必须要改数据库等很多地方,这个不现实。
那现在只能修改sql语句,
百度了一下,mysql里面如何用sql语句让字符串的‘123’转换为数字的123?
找到这三种方法:
方法一:SELECT CAST(‘123‘ AS SIGNED);
方法二:SELECT CONVERT(‘123‘,SIGNED);
方法三:SELECT ‘123‘+0;
最后实践发现只有第二种方法能够用,第一种方法:tomcat无法启动,第三种的话,相当于该成int型
用了第二种方法后,发现只能获取到数字8,而无法获取小数点后的数字。
于是我百度了一下CONVERT,最后发现了要用DECIMAL,才能获取到float类型
CONVERT(“8.4”,DECIMAL )
但是这样还会只能获取到“8”,于是只能再寻找其他方法。
在经历多次失败后,发现还是上面那种方法最好。
最后,在一个问题中发现了CONVERT(“8.4”,DECIMAL )奥秘
原来DECIMAL后面可以加数字,变成:
SELECT CONVERT(‘119.44‘,DECIMAL(3,1) )
DECIMAL(3,1)
3:表示定点精度,说白了就是总共保留多少个字数,
1:表示保留小数点后几位。
SELECT CONVERT(‘19.44‘,DECIMAL(3,1)
当数字为19.44时,获取的数字只会保留小数后一位
当数字为119.44时,保留一位小数点,应该为119.4
但是因为定点精度为3,所以不能取这么大的值,最后获得的数字为99.9
最后,就以这样的结果结束了bug的查询!!23333
标签:
原文地址:http://my.oschina.net/chenfwind/blog/529071