Hibernate 的查詢語言 Criteria 和Query

來源:互聯網
上載者:User

crieria.uniqueResult();代表結果唯一取出結果
lazy載入,只要不適用就不進行載入(根據設定檔的策略)
有時要覆蓋設定檔的策略-------左串連的引入《》

 

兩個檢索語句同時寫代表and關係
sql1  and  sql2 、
Expression.eq  等於
Expression.alleq
Expression.gt  大於
Expression.in 需要一個集合add(Expression.in())
Set set =new TreeSet();
set.add(new Integer(3));
set.add(new Integer(2));


in的用法
crieria.add(Expression.in("id",set));查詢id在2和3之間的資料,or
第二種寫法       
crieria.add(Expression.or(Expression.eq("id",new Integer(1)),Expression.eq("id",new Integer(1))))

and操作
crieria.add(Expression.add(lhs,rhs))

模糊操作
crieria.add(Expression.like("name","%s%"))

 Hibername 的分頁技術
crieria.setFirstResult(2);
crieria.setMaxResult(2);
List list =crieria.list();
list 中就是第二頁的list集合

Criteria只能對一個對象進行查詢(當查詢條件比較動態時候)  所以引入query

  HQL語句查詢
hql的語句有Hibernate來完成,查詢的也是對象
可以把關係的表在記憶體中類比成為封裝好的物件導向的資料庫,所以直接可以看過查詢對象

實體查詢
String hql="from Demo a where a.id=1";//類名字和屬性名稱字如Demo需要區分大小寫,而關鍵字from不區分大小寫
Query query=session.createQuery(hql);

屬性查詢(需要select)
如果只想取出屬性中的一部分就需要用到select了,select user.name from User user。
String hql="select n.name,n.id from Demo n ";
Query query=session.createQuery(hql);
List list=query.list;
for(int i=0;i<list.length;i++)
Objext[] vv=(Object[])list.get(i);
System.out.println((String)vv[0]);
System.out.println((Integer)vv[1]);


String hql="select new Demo(n.name) from Demo n ";前提是Demo中有個參數是String的構造方法

刪除操作

hql="delete from Demo where name='lisi'"
Query query=session.createQuery(hql);
query.executeUpdate();//需要使用Update
trx.commit();(commit中包括一個session.flush())
當資料行數很多的時候
int num=query.executeUpdate();
if(num%25==0)
session.flush();
意思是每25行進行一次操作


 如何寫sql語句中的count(*)
String hql ="select count(a.id) from Room"
Query query=session.createQuery(hql);
Object o=query.uniqueResult();取出的結果應該是一個long的數值
Integer num=(Long)o;
System.out.println(num.longValue());

 

 實現串連查詢(Test30)
String hql ="from Room a left join a.stuSet b where a.id=1"(Room和學生的集合想關聯)
這時候檢索出來的是數組,list中每一個都是一個數組0是Room,而1是Student,有多少個學生就會有多少條記錄
for(int i=0;i<list.size();i++)
{
Object[] vv=(Object[])list.get(i);
Room room=(Room) vv[0];
Student stu=(Student) vv[1];
}


 加入關鍵字fetch(Test31)迫切左外串連
from Room a left join fetch a.stuSet b where a.id=1

這時就直接取出一個Room對象,在Room的stu集合中是有資料的
這個fetch會覆蓋掉配置中的lazy屬性


 填充資料,類似preparestatement
方法1.“from User user where user.name=? And user.age=?”
Query query=session.createQuery


方法2...........................

 

 

 


總結
criteria適合對一個對象進行查血 只能進行檢索 動態實現條件查詢

作業:建立以學生的表(超多屬性)複雜查詢的分頁語句

query
  select update delete
實體查詢 from 屬性檢索 select
left outer join
left outer join fetch

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.