hibernate.QueryException: Space is not allowed after parameter prefix ':' -----hibernate3.6.10中的BUG

部署运行你感兴趣的模型镜像

 

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

 

MyTry:

将3.6.10版本换成4.3.11就好

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

`java.sql.SQLException: ResultSet operation not allowed after ResultSet closed` 这是一个常见的 SQL 异常错误提示,表示尝试对已经关闭的 `ResultSet` 对象进行操作。 ### 原因分析 1. **资源未正确管理**:通常在数据库查询完成后,`ResultSet`, `Statement` 和 `Connection` 都需要手动关闭。如果过早地关闭了 `ResultSet` 或其关联的 `Statement`、`Connection`,那么后续对该 `ResultSet` 的访问就会抛出这个异常。 2. **游标的生命周期结束**:SQL 查询结果是由数据库服务器返回的一个“指针”或“游标”,当该游标被显式或隐式关闭后,再次对其进行读取会失败。 3. **连接池的行为影响**:如果你使用的是一种数据库连接池技术,在某些框架下可能会自动回收和关闭底层的对象,而此时程序仍试图继续处理已关闭的结果集。 ### 解决方案 为了避免上述问题发生,请注意以下几点: - 确保所有相关的对象 (`ResultSet`, `Statement`, `PreparedStatement`) 按正确的顺序关闭,并尽量靠近它们作用域末端的位置释放; - 尽量将数据从 `ResultSet` 中提取出来并存储到本地变量或其他结构(如 List<Map<String, Object>>),然后再断开与数据库之间的物理链接; ```java try (Connection conn = DriverManager.getConnection(DB_URL); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM table")) { while(rs.next()){ // Process each row... } } catch(SQLException e){ System.err.println(e.getMessage()); } ``` 通过使用 Java7+ 推荐的 try-with-resources 自动化机制可以有效避免内存泄漏及类似本题这样的运行期错误情况出现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值