hibernate占位符的问题导致无法执行带变量的mysql sql语句

本文介绍了一种在Hibernate框架中遇到的复杂SQL占位符问题,并提供了两种解决方案:一是通过createNativeQuery方式执行;二是启用Hibernate自定义SQL模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天为研发改写了一个巨复杂的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模式即可

### 后端实现 SQL 模糊查询的方法 #### 使用 PHP 和 MySQL 实现中文模糊查询 为了在 PHP 中实现针对 MySQL 数据库的中文模糊查询,可以采用如下方法。此方式适用于需要根据用户输入的内容来查找相似记录的情况。 ```php <?php // 建立数据库连接 (注意替换为自己的数据库信息) $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "database"; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $searchTerm = $_GET['search']; // 获取来自用户的搜索关键词 $sql = "SELECT * FROM table_name WHERE column LIKE '%" . htmlspecialchars($searchTerm) . "%'"; $result = $conn->query($sql); while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - Name: " . $row["name"]. "<br>"; } $conn->close(); ?> ``` 这段代码展示了如何接收前端传来的参数并将其应用于 `LIKE` 子句中以完成模糊匹配操作[^1]。 #### 动态构建 SQL 查询语句支持空值和模糊匹配 当涉及到更复杂的场景,比如允许某些字段为空的同时也支持其他字段上的模糊匹配时,可以通过编程语言特性动态创建 SQL 语句。这里给出 Python Flask 结合 SQLAlchemy ORM 的例子: ```python from flask import request from sqlalchemy import or_ class QueryBuilder(object): @staticmethod def build_query(model_class): query = model_class.query form_data = request.form.to_dict() for key, value in form_data.items(): if not value.strip(): continue field = getattr(model_class, key, None) if isinstance(field.property.columns[0].type, String): condition = field.ilike(f'%{value}%') query = query.filter(or_(field == value, condition)) return query.all() # 调用示例 results = QueryBuilder.build_query(UserModel) for result in results: print(result.name) ``` 上述片段说明了怎样通过遍历表单数据字典,并仅对非空白条目应用过滤条件的方式来进行灵活高效的查询[^2]. #### JPA 编程中的 Like 操作符使用技巧 对于 Java 开发者来说,在 Spring Data JPA 或 Hibernate 上下文中执行模糊查询是非常常见的需求之一。下面是一个具体的实例展示如何正确运用 JPQL 来达成目的: ```java public interface ShareRepository extends JpaRepository<Share, Long> { @Query("select DISTINCT s from Share s where lower(s.tags) like %?1% ORDER BY s.subject ASC") List<Share> findByTagsLike(String tag); } ``` 值得注意的是,在定义JPQL查询字符串的时候应该移除掉围绕占位符 `%` 符号之外多余的单引号,从而确保能够成功检索到预期的结果集[^3]. #### MyBatis resultMap 处理多条件模糊查询 最后介绍一种利用MyBatis框架下的 `<foreach>` 标签配合自定义 `resultMap` 映射关系解决复杂业务逻辑问题的办法——即从前端获取一组可能含有不确定数量成员的集合作为筛选依据,再由后端负责组装最终要发送给DBMS解析执行的有效SQL指令. ```xml <select id="findWithFuzzyConditions" parameterType="map" resultMap="BaseResultMap"> SELECT * FROM some_table t <where> <foreach collection="fuzzyList" item="item" open="" close="" separator="OR"> CONCAT(t.fieldA,'-',t.fieldB) LIKE #{item} </foreach> </where> </select> <!-- 定义 resultMap --> <resultMap id="BaseResultMap" type="com.example.SomeEntity"> <!-- 字段映射配置... --> </resultMap> ``` 以上XML片断描述了一个典型的基于MyBatis技术栈的应用程序里头怎么设置一个有多个潜在变量参与运算过程内的联合属性进行模式化比较的过程[^4].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值