hibernate addEntity

兩個表(實體), 1對多雙向關聯:

班級: Clazz (id, name)

學生: Student(id, name , class_id)

1. 查詢持久化對象  
1.1 簡單查詢,返回數據庫結構
view plaincopy to clipboardprint?
sql = "select c.* from clazz c,student s where s.class_id = c.id";     
  
List clazzs = (List)session.createSQLQuery(sql).list();  
sql = "select c.* from clazz c,student s where s.class_id = c.id";
List clazzs = (List)session.createSQLQuery(sql).list();
特別注意:返回結果是Object[]組成的List,通過Object下標訪問屬性

使用場合:非基於對象的查詢,複雜查詢

1.2 簡單查詢,返回持久化對象
sql = "select c.* from Clazz c , student s where s.class_id = c.id ";    List clazzs = (List) session.createSQLQuery(sql).addEntity(Clazz.class).list();

特別注意: 1.addEntity方法指定返回包含Clazz對象的List 2. 查詢出來的持久態對象,clazz對象的studets屬性是各代理對象,訪問的時候纔會去查詢DB 使用場合:基於對象的查詢,但對象簡單查詢

1.3 多表查詢,返回多個實體
view plaincopy to clipboardprint?
String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id   ";  
  
List clazzs = (List) session().createSQLQuery(sql)  
  
                                 .addEntity("c", Clazz.class)  
  
                                 .addEntity("s", Student.class).list();  
String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id   ";
List clazzs = (List) session().createSQLQuery(sql)
.addEntity("c", Clazz.class)
.addEntity("s", Student.class).list();
view plaincopy to clipboardprint?
特別注意:   
1. addEntity方法指定了當前返回實體的別名,而且在SQL語句裏使用{c.*}這樣的語句,  
它的意思是向別名爲c的這個對象注入所有屬性值.  
特別注意:
1. addEntity方法指定了當前返回實體的別名,而且在SQL語句裏使用{c.*}這樣的語句,
它的意思是向別名爲c的這個對象注入所有屬性值.
view plaincopy to clipboardprint?
2. 這個查詢會返回一個Object的List,每個Object包含兩個對象一個Clazz,一個Student  
view plaincopy to clipboardprint?
3. {}佔位符裏是對象的屬性,而非列名,如{s.class},而非{s.class_id}  
view plaincopy to clipboardprint?
4. 必須注入對象的每個屬性值,你可以使用{c.*},或者手工寫全所有,但必須是所有屬性。(這個太讓我鬱悶了。   
view plaincopy to clipboardprint?
使用場合:基於對象的查詢,複雜查詢  
1.4 多表查詢,返回關聯實體

view plaincopy to clipboardprint?
String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id   ";  
  
List clazzs = (List) session().createSQLQuery(sql)  
  
        .addEntity("c", Clazz.class)  
  
        .addJoin("s", "c.students").list();  
String sql = "select {c.*}, {s.*} from Clazz c , student s where s.class_id = c.id   ";
List clazzs = (List) session().createSQLQuery(sql)
.addEntity("c", Clazz.class)
.addJoin("s", "c.students").list();
view plaincopy to clipboardprint?

特別注意: 這塊有些問題,明明應該返回Clazz的List的,但確返回包含Clazz和Student的Object的List, faint

使用場合:基於對象的查詢,複雜查詢

  
2. 查詢託管對象

view plaincopy to clipboardprint?
String sql = "select c.id, c.name from Clazz c , student s where s.class_id = c.id   ";     
  
List clazzs = (List) session.createSQLQuery(sql)        
  
                                     .addScalar("id", Hibernate.LONG)  
  
                                     .addScalar("name", Hibernate.STRING)       
  
                                     .setResultTransformer(Transformers.aliasToBean(Clazz.class)).list();  
String sql = "select c.id, 
c.name from Clazz c , student s where s.class_id = c.id   ";
List clazzs = (List) session.createSQLQuery(sql)
.addScalar("id", Hibernate.LONG)
.addScalar("name", Hibernate.STRING)
.setResultTransformer(Transformers.aliasToBean(Clazz.class)).list();

特別注意:

1. 如果不設置addScalar方法可能會報轉型錯誤的異常.

2.託管查詢可以使用投影,只查詢指定的列屬性

==================================================華麗分割====以上爲轉載http://blog.sina.com.cn/s/blog_5fcdcbf70100lfuq.html=====
以下爲運用之後的,加入了查詢。
  1. Query query = this.getSession().createSQLQuery("select {em.*},{pc.*},{dept.*},{p.*} " +  
  2.                 "from t_postcount pc ,t_post p ,t_employees em ,t_department dept " +  
  3.                 "where pc.post = p.id and pc.epid = em.id and p.pid = dept.id " +  
  4.                 "and em.id = "+employeesId+" order by dept.id,pc.date desc ")  
  5.                 .addEntity("em",Employees.class)  
  6.                     .addEntity("pc",PostCount.class)  
  7.                             .addEntity("dept",Department.class)  
  8.                                     .addEntity("p",Post.class);  
  9.         List l = query.list();  
  10.         List list = new ArrayList();  
  11.         for(int i=0;i
  12.             PostCountBean pcb = new PostCountBean();  
  13.             pcb.setName(((Employees)l.get(i)[0]).getName());  
  14.             pcb.setDate(( (PostCount)l.get(i)[1]).getDate());  
  15.             pcb.setDname(( (Department)l.get(i)[2]).getName());  
  16.             pcb.setPname(( (Post)l.get(i)[3]).getName());  
  17.             pcb.setPostNum(( (PostCount)l.get(i)[1]).getPostNum());  
  18.             System.out.print (((Employees)l.get(i)[0]).getName());  
  19.             System.out.print (( (PostCount)l.get(i)[1]).getDate());  
  20.             System.out.print (( (Department)l.get(i)[2]).getName());  
  21.             System.out.println(( (Post)l.get(i)[3]).getName());  
  22.             list.add(pcb);  
  23.         }  

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