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

  1. package cait.cnas.dao.impl;
  2. import java.util.List;
  3. import org.hibernate.Query;
  4. import org.springframework.dao.DataAccessException;
  5. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
  6. import cait.cnas.bo.SetApplyType;
  7. import cait.cnas.dao.ISetApplyTypeDAO;
  8. /**
  9.  * @author linlw
  10.  *
  11.  */
  12. public class SetApplyTypeDAOImpl extends HibernateDaoSupport implements ISetApplyTypeDAO{
  13.     /*  
  14.      *  根据计划安排流程号
  15.      */
  16.     public String findTypeName(String type) {
  17.             
  18.         List resultList;
  19.         String typeName = "";
  20.         
  21.         String strHql= "select p from SetApplyType p where p.name like :name";  // 分别执行③可以。
  22.         String strHql1= "select p from SetApplyType p where p.name like ?";     // 分别执行①可以。
  23.         
  24.         String strHql2= "select p from SetApplyType p where p.name like "+type; //用拼接HQL的方式,执行②,虽不抛异常,
  25.                                                                                 //但resultList.size() = 0
  26.         
  27.                     
  28.         try{
  29.             
  30.             resultList = this.getHibernateTemplate().find(strHql,type); //①
  31.             
  32.             resultList = this.getHibernateTemplate().find(strHql2); //②
  33.             
  34.             
  35.             Query query = this.getHibernateTemplate().getSessionFactory().openSession().createQuery(strHql);//③
  36.             query.setString("name",type);
  37.             resultList = query.list();
  38.             
  39.             if(resultList.size() > 0){
  40.                 SetApplyType setApplyType = (SetApplyType)resultList.get(0);
  41.                 typeName = setApplyType.getCode();
  42.             }
  43.         
  44.         }catch(DataAccessException t){
  45.             t.printStackTrace();
  46.             throw t;
  47.         }
  48.             
  49.         return typeName;
  50.     }
  51. }

在网上整理的回复帖子:

 

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

 

 

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

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

 

如下:

  1.  <bean id="sessionFactory"
  2.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  3.         <property name="dataSource">
  4.             <ref bean="dataSource" />
  5.         </property>
  6.         <property name="hibernateProperties">
  7.             <props>
  8.                 <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
  9.                 <prop key="hibernate.show_sql">true</prop>
  10.                <prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop> 
  11.             </props>
  12.         </property>
  13.         <property name="mappingResources">
  14.             <list>
  15.                 <value>cait/cnas/bo/BusiUserOp.hbm.xml</value>
  16.                 <value>cait/cnas/bo/AppPerson.hbm.xml</value>
  17.                 <value>cait/cnas/bo/OrgBaseinfo.hbm.xml</value>
  18.                 <value>cait/cnas/bo/Pnumber.hbm.xml</value>
  19.                </list>
  20.         </property>
  21.     </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,sql,Hibernate,Class)