程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 解決Hibernate原生SQL映射問題

解決Hibernate原生SQL映射問題

編輯:關於JAVA

在問答裡和論壇中,經常看到有人問,怎樣將使用本地SQL查詢出來的結果映射為值對象的問題,這裡就Hibernate中提供的方法做個結論。前提,這裡沒有使用屬性的延遲加載技術。

假設有個值對像,如下:

Java代碼

package test;

public class Person {
   private Long id;
   private String name;
   private Long age;
   private Long phone;
   private String address;

   public Person(Long id, String name, Long age, Long phone, String address) {
     this.id = id;
     this.name = name;
     this.age = age;
     this.phone = phone;
     this.address = address;
   }

   public Long getId() {
     return id;
   }

   public void setId(Long id) {
     this.id = id;
   }

   public String getName() {
     return name;
   }

   public void setName(String name) {
     this.name = name;
   }

   public Long getAge() {
     return age;
   }

   public void setAge(Long age) {
     this.age = age;
   }

   public Long getPhone() {
     return phone;
   }

   public void setPhone(Long phone) {
     this.phone = phone;
   }

   public String getAddress() {
     return address;
   }

   public void setAddress(String address) {
     this.address = address;
   }
}

如果查詢全部五列記錄的話,那麼只要

Java代碼

List list = getHibernateTemplate().loadAll(Person.class);

如果只需要查詢id,name,age三列記錄呢?那麼就要新增構造方法了,

Java代碼

 public Person(Long id, String name, Long age) {
  this.id = id;
  this.name = name;
  this.age = age;
  }

然後呢,就可以通過HQL來進行查詢。

Java代碼

List list = getHibernateTemplate().find("select new test.Person(id,name,age) from Person");

這個方法通常可以滿足需要了,只是如果,只需要查詢id,name,phone三列記錄的話,還新增構造方法?不行了,會出現構造方法沖突了。有個辦法:

Java代碼

List list = getSession().createQuery("select id,name,phone from person")
    .addScalar("id",Hibernate.Long).addScalar("name").addScalar("phone",Hibernate.Long)
    .addEntity(Person.class);

但是,這個只適用於存在Person實體的,如果Hibernate中沒有進行Person映射的呢,系統中只存在一個JavaBean。

Java代碼

List list = getSession().createSQLQuery("select id \"id\",name \"name\",phone \"phone\" from person")
    .addScalar("id",Hibernate.Long).addScalar("name").addScalar("phone",Hibernate.Long)
    .setResultTransformer(Transformers.aliasToBean(Person.class)));

那麼Hibernate就會自動將查出來的三列內容組裝到VO對象中去,只是代碼量有點大,而且名稱都需要重新定義為小寫的,在Oracle中查出來的列都默認為大寫的(不知道其它數據庫怎麼樣)

這個辦法就不依賴於構造方法了,只需要定義私有變量,設置getter/setter方法就行了。

不過如果更猛點的,根本就沒有JavaBean對象可以填充怎麼辦,Hibernate可以將查出來的列組裝到集合類中去。如Map。

Java代碼

List list = getSession().createSQLQuery("select * from person")
           .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);

除了這個Transformers還可以將列轉化為List。

Java代碼

List list = getSession().createSQLQuery("select * from person")
           .setResultTransformer(Transformers.T0_LIST);

到此,還可以通過繼承Transformers將結果映射為其它對象,不累述了,基本功能夠用了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved