1. 程式人生 > >hibernate學習筆記5---實體類或屬性名與資料庫關鍵字衝突、hql命名引數、hql實現通用分頁

hibernate學習筆記5---實體類或屬性名與資料庫關鍵字衝突、hql命名引數、hql實現通用分頁


一、實體類或屬性名與資料庫關鍵字衝突問題
1、實體類名與資料庫中的關鍵字衝突
比如:實體表User與oracle中的系統表衝突
解決方式1:在xml中新增table屬性,指定表名,使其不與name預設相等

<?xml version="1.0" encoding="UTF-8"?>
<!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屬性,指定特定的欄位

<?xml version="1.0" encoding="UTF-8"?>
<!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:不能修改欄位名,可以在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介面中的這兩個方法,實現了通用的分頁方式,增加了程式的可移植性。