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