zoukankan      html  css  js  c++  java
  • ibernate学习笔记5---实体类或属性名与数据库关键字冲突、hql命名参数、hql实现通用分页


    一、实体类或属性名与数据库关键字冲突问题
    1、实体类名与数据库中的关键字冲突
    比如:实体表User与oracle中的系统表冲突
    解决方式1:在xml中添加table属性,指定表名,使其不与name默认相等

    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE hibernate-mapping PUBLIC  
    3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
    5. <hibernate-mapping package="cn.itcast.hibernate.domain">  
    6.     <class name="User" table="tb_User">  
    7.         <!-- 对象标示符,类型可以不写,hibernate自己识别 -->  
    8.         <id name="id" column="id">  
    9.             <!-- 指定主键生成方式。  
    10.         native根据方言判定生成主键的方式  
    11.          -->  
    12.              <generator class="native"/>   
    13.         </id>  
    14.           
    15.         <property name="name" column="name" />  
    16.         <property name="birthday"  />  
    17.     </class>  
    18.   
    19.   
    20. </hibernate-mapping>  

    解决方式2:假如与之对应的表是原来有的,不能修改表名,可以在table属性中添加`` (反引号就是1前面的按键,来指定名称)

    <class name="User" table="`User`">

    2、属性名与数据库关键字冲突问题
    解决方式1;在xml中property节点中添加column属性,指定特定的字段

    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <!DOCTYPE hibernate-mapping PUBLIC  
    3.         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    4.         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
    5. <hibernate-mapping package="cn.itcast.hibernate.domain">  
    6.     <class name="User" table="tb_User">  
    7.         <!-- 对象标示符,类型可以不写,hibernate自己识别 -->  
    8.         <id name="id" column="id">  
    9.             <!-- 指定主键生成方式。  
    10.         native根据方言判定生成主键的方式  
    11.          -->  
    12.              <generator class="native"/>   
    13.         </id>  
    14.           
    15.         <property name="name" column="name" />  
    16.         <property name="birthday"  />  
    17.     </class>  
    18.   
    19.   
    20. </hibernate-mapping>  


    解决方式2:不能修改字段名,可以在column属性中添加`` (反引号就是1前面的按键,来指定名称)

    <property name="name" column="`name`" />
    二、关于hibernate.cfg.xml的所有属性值
    可以到hibernate官网下载源码,
    hibernate-release-4.2.1.Finalprojectetchibernate.properties.template

    hibernate-release-4.2.1.Finalprojectetchibernate.properties文件中有所有的可配置的属性值

    三、hql的命名参数
    例子:
     /**
      * 使用HQL根据name查询方法
      * @param entity
      */
     public static void Query(String name){
      
      Session s = null;
      try {
       s=HIbernateUtil.getSession();
       //HQL:
       //这里的from后面跟的不是表名,而是对象名(类名)
       String hql = "from User as user where user.name=?"; //from Object 支持多态度
       Query query = s.createQuery(hql);
       query.setString(0, name);
       List<User> list=query.list(); //executQuery(); 
       for(User user:list){
        System.out.print(user.getName());
       }
       
       //如果确定数据最多只有一条,可以使用一下的方法简化代码
       User u= (User)query.uniqueResult();
       System.out.print("只有一条数据"+u.getName());
      } finally {
       if(s!=null){
        s.close();
       }
      }
     }
    后面的赋值的参数(索引),与?的位置一一相对应。
    如果有很多的参数,则方便赋值,很容易出错。
    解决方式:使用命名参数:name如:

     public static void Query(String name){
      
      Session s = null;
      try {
       s=HIbernateUtil.getSession();
       //HQL:
       //这里的from后面跟的不是表名,而是对象名(类名)//   String hql = "from User as user where user.name=?"; //from Object 支持多态度
       String hql = "from User as user where user.name=:name"; //使用命名参数取代?
       Query query = s.createQuery(hql);
       query.setString("name", name);
       
       //通过Query实现跨数据库的通用分页
       query.setFirstResult(0);//从第多少条开始获取数据
       query.setMaxResults(100);//共取多少条数据
       List<User> list=query.list(); //executQuery(); 
       for(User user:list){
        System.out.print(user.getName());
       }
       
       //如果确定数据最多只有一条,可以使用一下的方法简化代码
       User u= (User)query.uniqueResult();
       System.out.print("只有一条数据"+u.getName());
      } finally {
       if(s!=null){
        s.close();
       }
      }
     }
    好处:这样就不依赖位置了,只要名字对应上即可。sql中多次使用同一参数时,一次赋值即可。代码简洁
    四、Query接口的分页查询
    解释说明:每个数据库都用不同的分页方式,hibernate通过在hibernate.cfg.xml中配置
    <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property><!-- 方言 -->以识别不同数据库,使低层使用相应的分页方式
    //通过Query实现跨数据库的通用分页
       query.setFirstResult(0);//从第多少条开始获取数据
       query.setMaxResults(100);//共取多少条数据
    好处:Query接口中的这两个方法,实现了通用的分页方式,增加了程序的可移植性。

  • 相关阅读:
    英语4月测试题
    Hadoop---集群的时间同步
    Hadoop---日志服务器
    Hadoop---桥接集群的搭建
    HDFS
    虚拟机类加载机制
    Hadoop---集群的搭建(仅主机模式)
    YARN
    垃圾收集算法和垃圾收集器
    Hadoop---HDFS读写流程
  • 原文地址:https://www.cnblogs.com/tian830937/p/4495807.html
Copyright © 2011-2022 走看看