org.springframework.orm.hibernate3.HibernateQueryException中的一个小异常

本文详细解析了在使用Hibernate框架进行数据库查询时遇到的Position beyond number of declared ordinal parameters错误原因及解决方案,通过调整参数设置与SQL语句匹配,确保查询正确执行。

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

在使用Hibernate的时候,出现了这样的一个错误:

org.springframework.orm.hibernate3.HibernateQueryException:
Position beyond number of declared ordinal parameters. 
Remember that ordinal parameters are 1-based! Position: 2; 
nested exception is org.hibernate.QueryParameterException: 
Position beyond number of declared ordinal parameters. 
Remember that ordinal parameters are 1-based! Position: 2

这个错误说是因为占位符数量不匹配的原因;

dao层:

@Override
	public List<T> findCollectionByConditionNoPage(String hqlWhere,final Object[] params,
			LinkedHashMap<String, String> orderby) {
		/**
		 * 组织HQL语句的Where条件
		 *      select * from elec_text o where 1=1     放置DAO层
				and o.textName like '%张%'              放置Service层
				and o.textRemark like '%李%'
				order by o.textDate desc , o.textName asc 
		 */
		String hql = "from " + entity.getSimpleName() + " o where 1=1";
		//组织排序条件
		String hqlOrderBy = this.orderByCondition(orderby);
		hql = hql + hqlWhere + hqlOrderBy;
		final String finalHql = hql;
		List<T> list = (List<T>)this.getHibernateTemplate().execute(new HibernateCallback(){
            public Object doInHibernate(Session session)
					throws HibernateException, SQLException {
				Query query = session.createQuery(finalHql);
				setParams(query,params);
				return query.list();
			}
		});
		return list;
	}
	
	/**  
	* @Name: setParams
	* @Description: 对where条件中的参数设置参数值
	* @Parameters: Object[] params 参数值
	* @Return: 无
	*/
	private void setParams(Query query,Object[] params) {
		for(int i=0;params!=null && i<params.length;i++){
			query.setParameter(i, params[i]);
		}
	}

	/**  
	* @Name: orderByCondition
	* @Description: 组织排序条件
	* @Parameters: LinkedHashMap<String, String> orderby 排序条件
	* @Return: String 排序语句的字符串
	*/
	private String orderByCondition(LinkedHashMap<String, String> orderby) {
		StringBuffer buffer = new StringBuffer("");
		if(orderby!=null){
			buffer.append(" order by ");
			for(Map.Entry<String, String> map:orderby.entrySet()){
				buffer.append(" " + map.getKey() + " " + map.getValue() + ",");
			}
			buffer.deleteCharAt(buffer.length()-1);
		}
		return buffer.toString();
	}

server层:

/**  
	* @Name: findCollectionByConditionNoPage 
	* @Description: 使用 查询条件,查询列表的集合(不分页)
	* @Parameters: ElecTextForm elecTextForm VO对象  
	* @Return: List<ElecText> 列表集合
	*/
	
	@Override
	public List<ElecText> findCollectionByConditionNoPage(
			ElecTextForm elecTextForm) {
		/**
		 * 组织HQL语句的Where条件
		 *      select * from elec_text o where 1=1     放置DAO层
				and o.textName like '%张%'              放置Service层
				and o.textRemark like '%李%'
				order by o.textDate desc , o.textName asc 
		 */
		String hqlWhere = "";
		List<String> paramsList = new ArrayList<String>();
		if(elecTextForm!=null && StringUtils.isNotBlank(elecTextForm.getTextName())){
			hqlWhere += " and o.textName like ?";
			paramsList.add("%"+elecTextForm.getTextName()+"%");
		}
		if(elecTextForm!=null && StringUtils.isNotBlank(elecTextForm.getTextRemark())){
			hqlWhere += " and o.textRemark like ?";
			paramsList.add("%"+elecTextForm.getTextRemark()+"%");
		}
		Object [] params = paramsList.toArray();
		/**
		 * 组织排序语句
		 *     order by o.textDate desc , o.textName asc 
		 */
		LinkedHashMap<String, String> orderby = new LinkedHashMap<String, String>();
		orderby.put("o.textDate", "desc");
		orderby.put("o.textName", "asc");
		//查询列表
		List<ElecText> list = elecTextDao.findCollectionByConditionNoPage(hqlWhere,params,orderby);
		for(int i=0;list!=null && i<list.size();i++){
			ElecText elecText = list.get(i);
			System.out.println(elecText.getTextName() + " " + elecText.getTextRemark());
		}
		return null;
	}

测试类:

/**
	 * 通过查询条件,查询对象的列表集合
	 * 模仿Action层
	 * */
	@Test
	public void findCollection(){
		IElecTextService elecTextService = (IElecTextService)ServiceProvider.getService(IElecTextService.SERVICE_NAME);
		//实例化PO对象,赋值,执行保存
		ElecTextForm elecTextForm = new ElecTextForm();
		elecTextForm.setTextName("张");
		elecTextForm.setTextRemark("高");
		//返回list集合
		List<ElecText> list = elecTextService.findCollectionByConditionNoPage(elecTextForm);
		
	}

原因是我的数据库匹配的数据只有一条信息,

当我再插入一条匹配信息的时候错误就消失了;

<think>好的,我现在需要解决用户提到的“org.springframework.orm.hibernate3包不存在”的问题。首先,我得回忆一下Spring和Hibernate的版本兼容性问题。用户提到的是hibernate3,而Spring框架的某些版本可能已经不再支持这个旧的Hibernate版本了。首先,用户可能是在他们的项目中引用了这个包,但依赖没有正确配置。我需要检查常见的解决方案,比如确认依赖是否正确添加。考虑到Maven和Gradle是常用的构建工具,用户可能是在pom.xml或build.gradle中缺少相应的依赖项。接下来,我需要考虑Spring和Hibernate3的兼容性。根据Spring的版本历史,可能在Spring3之后,对Hibernate3的支持逐渐减少,而转向Hibernate4或5。如果用户使用的是较新的Spring版本,比如Spring5,那么org.springframework.orm.hibernate3可能已经被移除了,这时候需要降级Spring版本或者升级Hibernate到更高版本。另外,用户可能错误地输入了包名,需要检查拼写是否正确。有时候,可能是简单的拼写错误导致的问题,比如多了一个字母或者少了一个点。 还有一种可能是仓库中没有这个包,特别是如果用户使用的是内部仓库或者配置错误的Maven仓库地址,可能需要检查仓库配置,确保能够从正确的仓库下载依赖。然后,我需要参考用户提供的引用内容。虽然引用中的内容主要关于Spring的Java配置和缓存,但其中提到@Configuration和@Bean的使用,这可能与Hibernate的配置有关。例如,用户可能在配置Hibernate时使用了过时的类或方法,导致依赖缺失。最后,生成相关问题需要考虑用户可能的后续疑问,比如如何迁移到新版本、替代方案有哪些、如何检查依赖冲突等。</think>### 解决“org.springframework.orm.hibernate3包不存在”问题的方法 #### 1. **检查依赖配置** - **Maven项目**:确保`pom.xml`中包含以下依赖: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>3.2.18.RELEASE</version> <!-- 需与Hibernate3兼容的Spring版本 --> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.10.Final</version> </dependency> ``` - **Gradle项目**:在`build.gradle`中添加: ```groovy implementation &#39;org.springframework:spring-orm:3.2.18.RELEASE&#39; implementation &#39;org.hibernate:hibernate-core:3.6.10.Final&#39; ``` - **注意**:Spring 5及以上版本已移除对Hibernate3的支持[^1]。 #### 2. **验证Spring版本兼容性** - **Spring 3.x**:支持Hibernate3,但需确保版本匹配。例如: - `spring-orm:3.2.18.RELEASE` + `hibernate-core:3.6.10.Final` - **Spring 4.x及以上**:建议升级到Hibernate4/5或降级Spring版本[^2]。 #### 3. **检查包名拼写** - 确认代码中引用的是正确的包路径: ```java import org.springframework.orm.hibernate3.HibernateTemplate; // 正确路径 ``` - 避免拼写错误(如`hibernat3`或`hibernate3.orm`)。 #### 4. **检查仓库配置** - 若使用Maven,确保仓库(如Maven Central)包含该包。在浏览器中访问: ``` https://repo1.maven.org/maven2/org/springframework/spring-orm/3.2.18.RELEASE/ ``` 确认`spring-orm-3.2.18.RELEASE.jar`存在。 #### 5. **替代方案:迁移到新版本** - 若需使用Spring 5+,建议升级Hibernate至4/5,并替换相关类: ```java import org.springframework.orm.hibernate5.HibernateTemplate; // Hibernate5对应的包 ``` - 更新依赖: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.3.23</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.14.Final</version> </dependency> ``` #### 6. **验证项目构建工具** - 执行`mvn clean install`或`gradle build`,查看是否下载了正确版本的依赖。 --- ### 相关问题 1. **如何检查项目中依赖冲突导致的类缺失问题?** - 使用`mvn dependency:tree`或`gradle dependencies`分析依赖树。 2. **Spring与Hibernate版本兼容性规则是什么?** - 参考Spring官方文档的版本矩阵,例如Spring 3.x仅支持Hibernate3.x[^2]。 3. **从Hibernate3迁移到Hibernate5需要修改哪些代码?** - 需替换`org.springframework.orm.hibernate3`为`hibernate5`包,并调整API调用(如`SessionFactory`初始化方式)。 4. **如何在IntelliJ/Eclipse中快速修复缺失的依赖包?** - 通过IDE的自动导入功能或依赖管理工具重新导入项目。 5. **为什么Maven Central仓库中找不到某些旧版本依赖?** - 部分旧版本可能被归档或移至其他仓库,需检查仓库配置或手动添加JAR包。 --- [^1]: 若使用Spring 5+,需注意其仅支持Hibernate5及以上版本,且包路径已调整为`org.springframework.orm.hibernate5`。 [^2]: Spring 3.x的官方文档明确标注了与Hibernate3的兼容性,建议通过版本管理工具锁定依赖版本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值