Hibernate的一些问题

1、Hibernate中Bean的属性名与数据的关键字冲突

  在xxx.hbm.xml配置文件中在关键字加一个"[]",例如<column name="[Explain]" length="500">,这样就可以解决命名冲突的问题,但是这样加上方括号以后createSQLQuery(String sql)中的sql的select子句中无法再使用该字段,一旦出现该字段名就会报错,只能使用HQL,所以数据库表的字段名一定不要和数据库的一些关键字重名,这样会带来很大的麻烦。

 

2、Hibernate中Bean的属性为何为封装类而非基本类型

  由于数据库中数据可以为Null值,所以只能用封装类来接收Null值,基本数据类型是无法接Null值得。

 

3、Hibernate在执行SQL表连接时,表与表之间有同名字段,查询结果有误

  表连接出现同名字段时,查询结果中所有该同名字段的值都是同一值,例如 tab_1有一个name,tab_2有一个name, 用Hibernate的查询结果中 tab_1的name值覆盖掉了tab_2的name值,要解决这个问题,首先SQL语句中select子句中每一个字段都要加一个别名,然后createSQLQuery后先调用addScalar(String str)将别名一个一个放进去就好了。

    //这是我的SQL语句
    public static final String INSTRUMENT_INFO = 
            " SELECT i01.Name AS typeName, i03.Name AS insName,d24.RunInfoID AS runInfoID ,i03.Unit AS unit, i03.Floor AS FLOOR, h03.Name AS username" +
            " from I03_Instruments_Instrument i03 " +
            "        left join I01_Instruments_Type i01 on i03.TypeID = i01.InstrumentsTypeID " +
            "        left join (" +
            "            select * from D24_Data_Run_State where RunDate like :runDate " +
            "        ) d24 on i03.InstrumentID = d24.TaskObjectID" +
            "         LEFT JOIN H03_HeatRelation_User h03 ON i03.UserID = h03.UserID" +
            " where i03.BuildingID = :buildingID and i03.State = 0 and i01.CategoryID in (:categoryID) " +
            " ORDER BY h03.Unit, h03.Floor, h03.RoomNumber" ;
    
     //这是执行查询的代码
     public List<Object[]> getList(String bulidingId, String runDate) {
       List<Integer> list = new ArrayList<Integer>() ;
       list.add(3);
       list.add(5);
       list.add(6);
          List<Object[]> instruments_1 = session.createSQLQuery(INSTRUMENT_INFO)
                .addScalar("typeName")
                .addScalar("insName")
                .addScalar("runInfoID")
                .addScalar("unit")
                .addScalar("Floor")
                .addScalar("username")
                .setString("runDate", runDate+"%")
                .setString("buildingID", buildingId)
                .setParameter("categoryID", list)
                .list();
            return instruments_1;
    }

 

  

4、Hibernate中如何用in来实现传入多个参数

  我们依然可以看上面的那写代码,SQL语句里面的where子句中有“ i01.CategoryID in (:categoryID)”, 这就是用来设置多个参数的,而下面的查询代码中可以看到有个一句“.setParameter("categoryID",list)”,这里的就是将List集合中的元素“3、5、6”放到了in()里面。

 

5、Hibernate调用存储过程

  使用createSQLQuery方法,只要将调用存储过程的语句放在"{}"之内即可

    public static final String SQL_PROCS_USER = " { CALL Proc_GetUsers(?) }" ;

    public List<S01SystemUser> getList_all(Session session, int userID) {
        List<S01SystemUser> list = session.createSQLQuery(SQL_PROCS_USER)
                .addEntity(S01SystemUser.class)
                .setInteger(0, userID)
                .list() ;
        return list ;
    }

 

6、Hibernate无法将Mysql的默认时间"0000-00-00 00:00:00"转换为Java的零点时间

  解决的方法是,在hibernate.cfg.xml中的url后面添加上"zeroDateTimeBehavior=convertToNull"即可,下面的代码是配置内容

<hibernate-configuration>
    <session-factory name="zldbManageHib">
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">数据库密码</property>
        <property name="hibernate.connection.url">jdbc:mysql://IP地址:端口号/数据库名?zeroDateTimeBehavior=convertToNull</property>
        <property name="hibernate.connection.username">数据库用户名</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="hibernate.show_sql">false</property>
        <property name="hibernate.format_sql">false</property>
        <property name="hibernate.use_sql_comments">false</property>
        <property name="connection.autoReconnect">true</property> 
        <property name="connection.autoReconnectForPools">true</property> 
        <property name="connection.is-connection-validation-required">true</property>
        
        <!-- 数据连接池 -->
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <property name="hibernate.c3p0.max_size">200</property>
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="hibernate.c3p0.timeout">30</property>
        <property name="hibernate.c3p0.max_statements">100</property>
        <property name="hibernate.c3p0.acquire_increment">3</property>
        <property name="hibernate.c3p0.idle_test_period">120</property>
        <property name="current_session_context_class">thread</property>
        <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
        <property name="hibernate.generate_statistics">false</property>
        <property name="hibernate.jdbc.batch_size">50</property>
        <property name="hibernate.c3p0.validate">true</property>
        <property name="hibernate.order_updates">true</property> 
    </session-factory>
</hibernate-configuration>

 

7、Hibernate中出现死连接(Connection)

  Mysql数据库对于长时间没有活动的连接直接关闭,而Java端的数据库连接池却仍然以以为连接未关闭,此时就会出现获取到的Session无法使用,解决的办法就是在hibernate.cfg.xml中配置三个参数即可,上图中已经存在即:connection.autoReconnect、connection.autoReconnectForPools、connection.is-connection-validation-required

 

转载于:https://www.cnblogs.com/dengjunwu/articles/3610822.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值