• 【转】Hibernate的getSQLQuery方法对char类型的解析问题


    【转】Hibernate的getSQLQuery方法对char类型的解析问题

    建立数据库:

    create table T_TEST1(

             id char (32),

           name varchar (255),

          other varchar (255),

        primary key(id)

    )insert into T_TEST1 values('2c9090792a18d6ab012a18d77e700001','sfasdf','asdf')

    insert into T_TEST1 values('2c9090792a18e5a5012a18e5ea830001','ddd','eeee')

    insert into T_TEST1 values('3001','ddd','eeee')

    insert into T_TEST1 values('haha','ddd','eeee')

    查询结果正常,如下:

           

    现在通过hibernate来查询。

    Session session = HibernateSessionFactory.getSession();

                       Transaction ts = ession.beginTransaction();

                       String sHQL = " select * from T_TEST1 ";

                       Query query = session.createSQLQuery(sHQL);

                       List list = query.list();

    得到的结果如下:

         

    可见第一列的id与数据库不一致,结果取得是数据库中的第一位。经过种种实验,得出结论,由于数据库中我们定义了id为char型,而hibernate自动会把char(n)转换为char(1)型,所以出现了上面的结果。

    知道了什么原因,我们就可以思考解决方案了。

    1)         把数据库方言做一下约束

    在hibernate.hbm.xml中修改数据库方言为我们自定义的。

    <property name="dialect">com.ying.LongCharDialect</property>

    重新定义一个新的方言类,使char型的数据映射为String类型

    public class LongCharDialect extends SybaseDialect {

        public LongCharDialect(){

            super();

            registerHibernateType(Types.CHAR, Hibernate.STRING.getName());

        }

    }

    2)         调用addScalar()方法

    Query query = session.createSQLQuery(sHQL).addScalar("id", Hibernate.STRING).addScalar("name");

    这样就解决了CHAR字段类型只出一位字符的问题。 但是需要把其他字段也addScalar()进来! addScalar(String arg)里的参数是需要大写的!

    3)         换用session.createQuery()方法,用HQL语言来查询,因为HQL语言全部把数据库映射成POJO和XML文件了,在XML文件中就有对应的映射规则,在里面我们把char类型的字段映射成String类型就行了。这样我们用createQuery()方法就能返回一个个的POJO类型的对象。

    4)         调用addEntity()方法,这个的前提也是得定义了映射实体类。

    Query query = session.createSQLQuery(sHQL).addEntity(TTest1.class);

         至此,已解决,不过还是建议不要用char类型,有那么好的varchar,为啥不用呢?

  • 相关阅读:
    c#常用正则表达式
    亲密接触Discuz!NT之架构篇:优良架构 方便网站整合与二次开发
    即时对话,在线对话,QQ,MSN,UC,popo
    C#事务处理
    正则表达式中的特殊字符
    9:38 2009729
    16:43 200981 缓解疲劳的七大唱片 免费短信
    复选框 全选
    9:05 2009721
    9:34 2009728
  • 原文地址:https://www.cnblogs.com/xtreme/p/3698909.html
Copyright © 2020-2023  润新知