hibernate多表查詢映射對象

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

    假設有個值對像,如下:

Java代碼 複製代碼
  1. package test;      
  2.      
  3. public class Person {      
  4.     private Long id;      
  5.     private String name;      
  6.     private Long age;      
  7.     private Long phone;      
  8.     private String address;      
  9.      
  10.     public Person(Long id, String name, Long age, Long phone, String address) {      
  11.         this.id = id;      
  12.         this.name = name;      
  13.         this.age = age;      
  14.         this.phone = phone;      
  15.         this.address = address;      
  16.     }      
  17.      
  18.     public Long getId() {      
  19.         return id;      
  20.     }      
  21.      
  22.     public void setId(Long id) {      
  23.         this.id = id;      
  24.     }      
  25.      
  26.     public String getName() {      
  27.         return name;      
  28.     }      
  29.      
  30.     public void setName(String name) {      
  31.         this.name = name;      
  32.     }      
  33.      
  34.     public Long getAge() {      
  35.         return age;      
  36.     }      
  37.      
  38.     public void setAge(Long age) {      
  39.         this.age = age;      
  40.     }      
  41.      
  42.     public Long getPhone() {      
  43.         return phone;      
  44.     }      
  45.      
  46.     public void setPhone(Long phone) {      
  47.         this.phone = phone;      
  48.     }      
  49.      
  50.     public String getAddress() {      
  51.         return address;      
  52.     }      
  53.      
  54.     public void setAddress(String address) {      
  55.         this.address = address;      
  56.     }      
  57. }     
  58.   
  59. package test;   
  60.   
  61. public class Person {   
  62.     private Long id;   
  63.     private String name;   
  64.     private Long age;   
  65.     private Long phone;   
  66.     private String address;   
  67.   
  68.     public Person(Long id, String name, Long age, Long phone, String address) {   
  69.         this.id = id;   
  70.         this.name = name;   
  71.         this.age = age;   
  72.         this.phone = phone;   
  73.         this.address = address;   
  74.     }   
  75.   
  76.     public Long getId() {   
  77.         return id;   
  78.     }   
  79.   
  80.     public void setId(Long id) {   
  81.         this.id = id;   
  82.     }   
  83.   
  84.     public String getName() {   
  85.         return name;   
  86.     }   
  87.   
  88.     public void setName(String name) {   
  89.         this.name = name;   
  90.     }   
  91.   
  92.     public Long getAge() {   
  93.         return age;   
  94.     }   
  95.   
  96.     public void setAge(Long age) {   
  97.         this.age = age;   
  98.     }   
  99.   
  100.     public Long getPhone() {   
  101.         return phone;   
  102.     }   
  103.   
  104.     public void setPhone(Long phone) {   
  105.         this.phone = phone;   
  106.     }   
  107.   
  108.     public String getAddress() {   
  109.         return address;   
  110.     }   
  111.   
  112.     public void setAddress(String address) {   
  113.         this.address = address;   
  114.     }   
  115. }    
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;   
    }   
}  

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代碼 複製代碼
  1. List list = getHibernateTemplate().loadAll(Person.class);     
  2.   
  3. List list = getHibernateTemplate().loadAll(Person.class);    
List list = getHibernateTemplate().loadAll(Person.class);  

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

 

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

Java代碼 複製代碼
  1. public Person(Long id, String name, Long age) {      
  2.     this.id = id;      
  3.     this.name = name;      
  4.     this.age = age;      
  5. }     
  6.   
  7.     public Person(Long id, String name, Long age) {   
  8.         this.id = id;   
  9.         this.name = name;   
  10.         this.age = age;   
  11.     }      
public Person(Long id, String name, Long age) {   
    this.id = id;   
    this.name = name;   
    this.age = age;   
}  

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


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

Java代碼 複製代碼
  1. List list = getHibernateTemplate().find("select new test.Person(id,name,age) from Person");     
  2.   
  3. List list = getHibernateTemplate().find("select new test.Person(id,name,age) from Person");      
List list = getHibernateTemplate().find("select new test.Person(id,name,age) from Person");  

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


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

Java代碼 複製代碼
  1. List list = getSession().createQuery("select id,name,phone from person").addScalar("id",Hibernate.Long).addScalar("name").addScalar("phone",Hibernate.Long).addEntity(Person.class);     
  2.   
  3. List list = getSession().createQuery("select id,name,phone from person").addScalar("id",Hibernate.Long).addScalar("name").addScalar("phone",Hibernate.Long).addEntity(Person.class);    
List list = getSession().createQuery("select id,name,phone from person").addScalar("id",Hibernate.Long).addScalar("name").addScalar("phone",Hibernate.Long).addEntity(Person.class);  

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代碼 複製代碼
  1. List list = getSession().createSQLQuery("select id \"id\",name \"name\",phone \"phone\" from person")      
  2.                     .addScalar("id",Hibernate.Long).addScalar("name").addScalar("phone",Hibernate.Long)      
  3.                     .setResultTransformer(Transformers.aliasToBean(Person.class)));     
  4.   
  5. List list = getSession().createSQLQuery("select id \"id\",name \"name\",phone \"phone\" from person")   
  6.                     .addScalar("id",Hibernate.Long).addScalar("name").addScalar("phone",Hibernate.Long)   
  7.                     .setResultTransformer(Transformers.aliasToBean(Person.class)));      
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)));  

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代碼 複製代碼
  1.     
  2. List list = getSession().createSQLQuery("select * from person")      
  3.                     .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);     
  4.   
  5. List list = getSession().createSQLQuery("select * from person")   
  6.                     .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);   
 
List list = getSession().createSQLQuery("select * from person")   
                    .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);  

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



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

Java代碼 複製代碼
  1. List list = getSession().createSQLQuery("select * from person")      
  2.                     .setResultTransformer(Transformers.T0_LIST);     
  3.   
  4. List list = getSession().createSQLQuery("select * from person")   
  5.                     .setResultTransformer(Transformers.T0_LIST);  
List list = getSession().createSQLQuery("select * from person")   
                    .setResultTransformer(Transformers.T0_LIST);  

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



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

轉自:http://zpball.iteye.com/blog/681165#

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章