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介面中的這兩個方法,實現了通用的分頁方式,增加了程式的可移植性。