您的位置:首页 > 编程语言 > Java开发

Spring+hibernate hql语句经hibernet的转化后中文乱码

2008-09-09 15:21 381 查看
package cait.cnas.dao.impl;

import java.util.List;

import org.hibernate.Query;

import org.springframework.dao.DataAccessException;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import cait.cnas.bo.SetApplyType;

import cait.cnas.dao.ISetApplyTypeDAO;

/**

* @author linlw

*

*/

public class SetApplyTypeDAOImpl extends HibernateDaoSupport implements ISetApplyTypeDAO{

/*

* 根据计划安排流程号

*/

public String findTypeName(String type) {

List resultList;

String typeName = "";

String strHql= "select p from SetApplyType p where p.name like :name"; // 分别执行③可以。

String strHql1= "select p from SetApplyType p where p.name like ?"; // 分别执行①可以。

String strHql2= "select p from SetApplyType p where p.name like "+type; //用拼接HQL的方式,执行②,虽不抛异常,

//但resultList.size() = 0

try{

resultList = this.getHibernateTemplate().find(strHql,type); //①

resultList = this.getHibernateTemplate().find(strHql2); //②

Query query = this.getHibernateTemplate().getSessionFactory().openSession().createQuery(strHql);//③

query.setString("name",type);

resultList = query.list();

if(resultList.size() > 0){

SetApplyType setApplyType = (SetApplyType)resultList.get(0);

typeName = setApplyType.getCode();

}

}catch(DataAccessException t){

t.printStackTrace();

throw t;

}

return typeName;

}

}

在网上整理的回复帖子:

有种bug叫作sql注入漏洞
就是说的你写的这种拼接sql 。

解决方法 1 )如果你想写Hql查询中文,那么中文的参数必须以参数的形式提供给查询;
原因好像是:中文占位的高低为问题产生的。
用绑定参数的方法可以解决 。用占位符,再用setString , 不要在HQL中直写中文。即上面的③对应的。

2)antlr的问题 , 暂时的解决方法是
将 hibernate.query.factory_class 属性设置成 org.hibernate.hql.classic.ClassicQueryTranslatorFactory ,是可以了,但用不了批量更新和删除功能(不知道正确否,待查)。

如下:

<bean id="sessionFactory"

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name="dataSource">

<ref bean="dataSource" />

</property>

<property name="hibernateProperties">

<props>

<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>

<prop key="hibernate.show_sql">true</prop>

<prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop>

</props>

</property>

<property name="mappingResources">

<list>

<value>cait/cnas/bo/BusiUserOp.hbm.xml</value>

<value>cait/cnas/bo/AppPerson.hbm.xml</value>

<value>cait/cnas/bo/OrgBaseinfo.hbm.xml</value>

<value>cait/cnas/bo/Pnumber.hbm.xml</value>

</list>

</property>

</bean>

3)又有的说:问题解决了,原来以前用的Hibernate为 Hibernate-Version: 3.1.2 ,这次用的是Hibernate-Version: 3.0.5。 把包换为3.1.2就可以了!这是Hibernate3.02- 3.05的 BUG 。解决办法是升级到 Hibernate3.1 rc2 ! 只需要替换 文件就可以了!

可以的,我原来用Hibernate3.05有这个问题,后来从www.hibernate.org上下载Hibernate3.1 rc2 的tar.gz包. 把这个包里的hibernate3.jar 考过来替换就行了. 其它的依赖的包,我全部用spring1.2.4里的. 如果你这样还不行,就没办法了,不过我的行了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: