码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2015-05-11 23:50:07      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:


一、实体类或属性名与数据库关键字冲突问题
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.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实现通用分页

标签:

原文地址:http://www.cnblogs.com/tian830937/p/4495807.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!