当前位置:Gxlcms > 数据库问题 > ibernate学习笔记5---实体类或属性名与数据库关键字冲突、hql命名参数、hql实现通用分页

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

时间:2021-07-01 10:21:17 帮助过:2人阅读

  • <!DOCTYPE hibernate-mapping PUBLIC  
  •         "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  •         "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  • <hibernate-mapping package="cn.itcast.hibernate.domain">  
  •     <class name="User" table="tb_User">  
  •         <!-- 对象标示符,类型可以不写,hibernate自己识别 -->  
  •         <id name="id" column="id">  
  •             <!-- 指定主键生成方式。  
  •         native根据方言判定生成主键的方式  
  •          -->  
  •              <generator class="native"/>   
  •         </id>  
  •           
  •         <property name="name" column="name" />  
  •         <property name="birthday"  />  
  •     </class>  
  •   
  •   
  • </hibernate-mapping>  
  •  

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

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

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

    [html] view plaincopyprint?  
    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.Final\project\etc\hibernate.properties.template

    hibernate-release-4.2.1.Final\project\etc\hibernate.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接口中的这两个方法,实现了通用的分页方式,增加了程序的可移植性。

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

    标签:

    人气教程排行