hibernate : No positional parameters in query 错误解决办法

本文介绍了一个关于Hibernate查询语句中使用占位符的问题及解决方案。错误发生在尝试使用带有通配符的参数化查询时,文章详细解释了如何正确设置查询以避免此问题。
部署运行你感兴趣的模型镜像

项目中一个查询的语句发生错误,错误提示如下:

java.lang.IllegalArgumentException: No positional parameters in query: from Student as stu where stu.studentName like '%?%'
	org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:332)
	org.hibernate.impl.AbstractQueryImpl.setString(AbstractQueryImpl.java:457)

查询语句为:

		Query query = session.createQuery("from Student as stu where stu.studentName like '%?%'");
		query.setString(0, studentName);
		List list = query.list();					//查询结果保存到list中

根据提示我们知道hibernate找不到合适的替换位置 ,也就是说?没有被检测到,这个应该是由于?被 '  ' 括起来了, 所以检测不到


后来将‘%?%‘ 修改为 '%' || ? || '%'通过。  || 字符串的连接符,比如'111'||'222' 其结果就是'111222'。




                

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

Linly-Talker

Linly-Talker

AI应用

Linly-Talker是一款创新的数字人对话系统,它融合了最新的人工智能技术,包括大型语言模型(LLM)、自动语音识别(ASR)、文本到语音转换(TTS)和语音克隆技术

<think>我们正在解决MicroPython中的TypeError: extra positional arguments given错误 根据引用[1][2][3]中提到的类似错误,这个错误通常是由于函数或方法调用时传递的参数数量超过了定义时所能接受的数量。 在MicroPython中,这个错误信息表明:在调用某个函数或方法时,提供了额外的位置参数(即参数数量过多)。 解决步骤: 1. 检查函数定义:查看函数或方法定义时声明的参数个数。 2. 检查函数调用:确认调用时传递的参数个数是否与定义一致。 3. 注意self参数:如果是类的方法,第一个参数是self(由解释器自动传入),调用时不要显式传递self。 可能的原因: a) 调用函数时传递了过多的参数。 b) 混淆了函数和方法的调用方式(方法调用时,实例会自动作为第一个参数传递,因此我们只需要传递剩余的参数)。 c) 在继承体系中,子类方法覆盖父类方法时,参数数量不一致。 示例分析: 假设我们有一个类: ```python class MyClass: def method(self, arg1): print(arg1) ``` 当我们创建实例并调用方法时: ```python obj = MyClass() obj.method(1, 2) # 错误!这里传递了两个参数,但方法只需要一个(除了self) ``` 错误信息:TypeError: extra positional arguments given 正确的调用应该是: ```python obj.method(1) # 正确,只传递一个参数(self由obj自动传入) ``` 另一个常见情况是回调函数: 例如,当我们设置一个中断处理函数时,该函数应该不带参数(或带一个参数,具体看硬件),但如果我们传递了一个需要更多参数的函数,就会出错。 解决步骤详细说明: 步骤1:定位错误 - 查看错误堆栈,找到是哪个文件的哪一行代码引发了错误。 步骤2:检查函数定义 - 找到该函数或方法的定义,查看它声明了几个参数。 步骤3:检查函数调用 - 比较调用时传递的参数个数和函数定义中的参数个数(注意:类方法会有一个自动传入的self,所以调用时传递的参数个数应该比定义少一个)。 步骤4:修正调用或函数定义 - 如果调用时参数过多,减少参数个数。 - 或者,如果确实需要传递这么多参数,修改函数定义,增加参数。 步骤5:注意特殊方法 - 在MicroPython中,一些特殊方法(如`__init__`)有固定的参数个数,不能随意更改。例如,引用[4]中,`__init__`方法被传递了6个参数,但定义只接受3到4个,所以出错。 步骤6:检查类继承 - 如果子类覆盖了父类的方法,要确保参数个数一致(除非使用*args和**kwargs)。 示例代码修正: 错误代码: ```python class Test: def run(self, a, b): return a + b t = Test() t.run(1, 2, 3) # 传递了3个参数,但run方法只需要两个(加上self,实际定义两个参数,调用时应该传递两个) ``` 修正后: ```python t.run(1, 2) # 正确,传递两个参数(self由t自动传入) ``` 或者,如果函数定义需要三个参数(包括self): ```python class Test: def run(self, a, b, c): # 定义三个参数(包括self) return a + b + c t.run(1, 2, 3) # 现在传递三个参数(self由t自动传入,所以这里三个参数对应a, b, c) ``` 注意:在MicroPython中,这个错误信息可能是“TypeError: extra positional arguments given”或者类似的表述。 其他注意事项: - 在MicroPython中,由于资源限制,错误信息可能略有不同,但含义相同。 - 如果函数使用了可变参数(*args),则不会出现这个错误,因为可以接受任意数量的位置参数。 如果问题仍然存在,请提供具体的代码片段,以便进一步分析。</think>在MicroPython中遇到`TypeError: extra positional arguments given`错误,通常表示在调用函数或方法时传递了超过其定义所需的参数数量。以下是详细解决步骤: ### 错误原因分析 1. **参数数量不匹配**:调用函数时传递的参数数量超过了函数定义中声明的参数数量 2. **类方法特殊处理**:类方法会自动接收`self`作为第一个参数,调用时不应显式传递 3. **回调函数问题**:事件处理程序等回调函数可能有特定参数要求 4. **继承问题**:子类方法覆盖时参数定义与父类不一致 ### 解决方法 #### 1. 检查函数定义与调用 ```python # 错误示例 def process_data(a, b): return a + b result = process_data(1, 2, 3) # 传递3个参数但函数只接受2个 ``` **修正方案**: ```python # 正确调用(参数数量匹配) result = process_data(1, 2) ``` #### 2. 类方法正确处理self参数 ```python class Sensor: # 定义方法时自动包含self参数 def read_value(self, pin): return pin.read() s = Sensor() # 错误调用(传递了2个显式参数) s.read_value(pin1, pin2) # TypeError! ``` **修正方案**: ```python # 正确调用(只传递1个显式参数) value = s.read_value(pin1) ``` #### 3. 使用*args处理可变参数 当需要灵活的参数数量时: ```python def log_message(*args): # *args接收任意数量参数 for msg in args: print(msg) # 可接受不同数量的参数 log_message("Startup") log_message("Temp:", 25.6, "Humidity:", 65) ``` #### 4. 检查回调函数签名 ```python # 定时器回调示例 def timer_callback(timer): # 自动接收timer对象 print("Timer fired") tim = Timer(period=1000, callback=timer_callback) ``` **常见回调参数要求**: - 定时器回调:接收1个`timer`参数 - 中断回调:通常接收1个`pin`参数 - 网络事件回调:接收特定事件对象 #### 5. 检查类继承关系 当子类覆盖父类方法时: ```python class Base: def configure(self, param1, param2): ... class Child(Base): # 错误:参数数量不一致 def configure(self, param1): ... ``` **修正方案**: ```python class Child(Base): # 保持与父类相同的参数签名 def configure(self, param1, param2): super().configure(param1, param2) ... # 扩展功能 ``` ### 调试技巧 1. 使用`dir()`检查对象方法: ```python print(dir(my_object)) # 查看对象可用方法 ``` 2. 检查函数期望的参数数量: ```python import inspect print(len(inspect.signature(my_function).parameters)) ``` 3. 添加调试打印: ```python print("Function called with:", args) # 在函数开头添加 ``` ### 预防措施 1. 使用类型提示(MicroPython部分支持): ```python def process(a: int, b: float) -> float: return a * b ``` 2. 关键函数添加参数验证: ```python def critical_func(a, b): if not isinstance(a, int) or not isinstance(b, float): raise ValueError("Invalid parameters") ``` 3. 文档字符串明确参数要求: ```python def read_sensor(pin): """ :param pin: Pin对象 (唯一参数) :return: 传感器数值 """ ``` > 提示:MicroPython的错误信息可能比CPython更简洁,但根本原因相同。通过检查函数定义与调用位置的参数匹配情况,95%的此类错误可快速解决[^1][^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值