Hibernate异常之org.hibernate.QueryException: Expected positional parameter count: 1, actual parameters

Hibernate QueryException异常原因及解决
这篇博客详细介绍了在使用Hibernate 3.6.10.Final时遇到的'Expected positional parameter count: 1, actual parameters: []'异常。作者通过异常描述、示例代码分析,指出问题在于查询中问号占位符未赋值,并提供了相应的解决方法。欢迎读者交流更多解决方案。" 126979888,13903852,企业级项目架构:项目搭建与代码规范实践,"['架构', '代码规范', 'vue.js']

1、异常描述

org.hibernate.QueryException: Expected positional parameter count: 1, actual parameters: [] [from Student where name like ?]

备注:

      此处hibernate版本号3.6.10.Final

2、示例代码

2-1 StudentDao.java

      public List<Student> findByName(String name){
		Session session = sessionFactory.getCurrentSession();
	    Transaction transaction = session.beginTransaction();
	    // 定义hql语句
	    String hql = "from Student where name = ?";
	    Query query = session.createQuery(hql);
	    List list = query.list();
	    transaction.commit();
	    return list;
	}

2-2 测试类

        @Test // 根据学生姓名查询所有学生信息
	public void testFindByName(){
		List<Student> list = studentDao2.findByName("张三");
		for (Student student : list) {
			System.out.println(student);
		}
	}

错误原因:在StudentDao.java中没有给问号占位符赋值。

 

3、解决方式

       // 根据学生姓名查询学生信息
	public List<Student> findByName(String name){
	    Session session = sessionFactory.getCurrentSession();
	    Transaction transaction = session.beginTransaction();
	    // 定义hql语句
	    String hql = "from Student where name = ?";
	    Query query = session.createQuery(hql);
	    // 问号占位符赋值
	    query.setString(0, name);
	    List list = query.list();
	    transaction.commit();
	    return list;
	}

 

此文希望可以帮助到大家。如有错误,请指教。                                                           

如果大家还有其他的情况或者好的解决方法,也望指教,感谢阅读。 

 

你遇到的这个错误: ``` org.opentest4j.AssertionFailedError: Expected :1761896546579 Actual :1761896546594 ``` 是一个典型的 **断言失败错误**,表示你期望的数值(Expected)是 `1761896546579`,但实际运行结果(Actual)是 `1761896546594`,两者相差 15 毫秒。 --- ### 📌 可能原因分析: 1. **你测试的是一个与时间相关的逻辑(例如记录设备断开时间)** - 你可能使用了 `System.currentTimeMillis()` 或 `System.nanoTime()` 来获取当前时间戳。 - 时间戳的精度和执行时机导致了微小差异。 2. **测试中使用了 `anyLong()` 等参数匹配器,但实际调用中使用了真实时间** - 如果你期望的是一个固定值,但实际传入的是运行时生成的时间戳,就可能导致断言失败。 --- ### ✅ 解决方案: #### ✅ 1. **使用 Mockito 模拟时间戳(推荐)** 如果你在测试中使用了 `System.currentTimeMillis()`,可以通过注入时间提供器(TimeProvider)或使用 `MockedStatic` 来模拟时间。 ##### 示例(使用 Mockito 模拟 `System.currentTimeMillis()`): ```java @Test void testRecordTime() { long fixedTimestamp = 1761896546579L; try (MockedStatic<System> utilities = Mockito.mockStatic(System.class)) { utilities.when(() -> System.currentTimeMillis()).thenReturn(fixedTimestamp); deviceDisconnectTimeCache.recordTime(OMADAC_ID, DEVICE_MAC); verify(cacheService, times(1)).set( eq(DeviceDisconnectTimeCache.DEVICE_DISCONNECT_TIME), eq(KEY), eq(fixedTimestamp), eq(TimeUtils.THIRTY_DAY_MILL_SECONDS), eq(TimeUnit.MILLISECONDS) ); } } ``` 这样你就可以控制时间戳的值,避免测试中出现不确定的行为。 --- #### ✅ 2. **如果时间戳不重要,使用 `anyLong()`** 如果你不关心时间戳的具体值,只需要确认方法被调用即可: ```java verify(cacheService, times(1)).set( eq(DeviceDisconnectTimeCache.DEVICE_DISCONNECT_TIME), eq(KEY), anyLong(), eq(TimeUtils.THIRTY_DAY_MILL_SECONDS), eq(TimeUnit.MILLISECONDS) ); ``` 但注意:**使用 `anyLong()` 时,其他参数必须都使用 `eq()`**。 --- ### 📝 总结 | 问题 | 解决方式 | |------|----------| | 时间戳不一致导致断言失败 | 使用 `MockedStatic` 模拟 `System.currentTimeMillis()` | | 不关心具体时间戳值 | 使用 `anyLong()` | | 使用了 `anyXxx()` 但部分参数未用 `eq()` | 所有参数都必须使用匹配器 | --- ### ✅
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值