jpa 原生查询createNativeQuery里面有冒号保留字关键字的问题
用\\:替换。
比如:
String sql = "select location.ToString() a,version,location.STDistance(geometry\\:\\:STGeomFromText('POINT(-22 60)', 4326)) b from spatial_event";
Query query = em.createNativeQuery(sql);
query.getResultList();
Encountered a duplicated sql alias [] during auto-discovery of a native-sql query:
这是由于select字段没有指定别名,加个别名就行。
ref link: https://blog.youkuaiyun.com/weixin_33825683/article/details/86020417
Space is not allowed after parameter prefix ':'
问题:在hibernate中执行mysql语句,如果mysql语句中含有@a := 1 之类的变量,回报这个错误
语句类似于“set @rownum=0, @preval=null; select @rnk:=IF((@rownum := @rownum + 1) and (@preval <=> sal), @rnk, @rownum) AS rnk, @preval:=sal sal FROM emp order by sal;”在mysql(5.X版本)中的sql编辑器中可以运行通过,但是在java程序中却抛出异常:org.hibernate.QueryException: Space is not allowed after parameter prefix ':' ....
在网上 查找了资料,却发现这是hibernate3.X包之下的一个bug,
(参照http://bugs.mysql.com/bug.php?id=41741)在hibernate4.X中已经修复。
但是项目中不可能使用hibernate4.0,最后不能不使用原生jdbc进行解决...
引用:http://huapengpeng1989412.blog.163.com/blog/static/58828754201291411578566/
https://www.cnblogs.com/siashan/p/4313761.html
https://my.oschina.net/pipimao/blog/1842196
今天为研发改写了一个巨复杂的sql,因为保密原因就不贴出来了,自觉得意之时开发哥哥抱怨说只能在命令行执行,一旦放程序里就报错(hibernate包装过)
这里给一个简单的sql来做例子:
select a.id ,a.d ,if(@od=a.d,@rank:=@rank+1,@rank:=1) num ,@od:=a.d from (select id ,d from number c order by c.id) as a ,(select @od:=null,@rank:=0 ) as b;
程序报错如下:
org.hibernate.QueryException: Space is not allowed after parameter prefix ':'
这其实是一个hibernate占位符的问题,解决方式有两种
1,使用createNativeQuery("SELECT @rank \\:= 1, @od \\:= 2, @a + @b");这种类似的方式(依赖于hibernate版本,具体哪个版本忘了)
2,使用hibernate自定义sql模式即可
原文链接:https://blog.youkuaiyun.com/lidan3959/article/details/18350951
4362

被折叠的 条评论
为什么被折叠?



