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里的. 如果你这样还不行,就没办法了,不过我的行了!
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里的. 如果你这样还不行,就没办法了,不过我的行了!
相关文章推荐
- 解决Spring和Hibernate整合时HQL查询语句乱码问题
- spring 管理hibernate3.0 hql中文乱码问题
- 关于Hibernate 查询语句中文乱码问题的解决
- hibernate之HQL传中文参数乱码 解决办法
- struts、spring、hibernate中文乱码问题解决
- jsp+mysql+hibernate+spring中文乱码问题
- Hibernate中hql转Sql中文乱码问题
- Tapestry+spring+hibernate整合使用时HQL语句问题!
- 【hibernate+Spring学习】S2SH整合笔记--中文乱码
- SpringMVC+HibernateValidator,配置在properties文件中的错误信息回显前端页面出现中文乱码
- Struts + Spring + Hibernate + Mysql中文乱码问题解决
- spring+hibernate三种hql语句的配置方式
- hibernate中文动态查询语句乱码问题
- JSTL+Spring+Hibernate中文乱码问题解决
- springboot+jpa+hibernate+idea做个实现数据库mysql增数据乱码,中文乱码为???
- Struts + Spring + Hibernate + Mysql中文乱码问题解决
- 【hibernate+Spring学习】S2SH整合笔记--中文乱码
- Spring+Hibernate应用中怎样解决中文乱码问题
- SpringMVC+HibernateValidator,配置在properties文件中的错误信息回显前端页面出现中文乱码
- hibernate3中hql中文参数乱码