Criteria查詢
用到特定于數(shù)據(jù)庫的SQL 語句,程序本身會依賴于特定的數(shù)據(jù)庫
不了解SQL 語句,恐怕對使用HQL帶來困難
Hibernate提供的Criteria查詢
幫助我們解決了這種問題
Criteria 查詢采用面向?qū)ο蠓绞椒庋b查詢條件,又稱為對象查詢
對SQL
語句進(jìn)行封裝
采用對象的方式來組合各種查詢條件
由Hibernate 自動產(chǎn)生SQL 查詢語句
Criteria由Hibernate
Session進(jìn)行創(chuàng)建
SessionFactory
sessionFactory
=
new Configuration().configure()
.
session
=
sessionFactory.openSession();
criteria
=
session.createCriteria(User.class);
//查詢該實體中所有數(shù)據(jù)
result
= criteria.list();
it
= result.iterator();
(
{
=
(User) it.next();
+ user.getName());
--------------------------------------------------------------
Criteria
criteria
=
session.createCriteria(User.class);
criteria.add(Restrictions.eq("name",
"bob"));
List
result
= criteria.list();
Iterator
it
= result.iterator();
//...
| 說 |
Restrictions.eq() | 對應(yīng)SQL的等于(’=’) |
Restrictions.allEq() | 使用Map,使用key/value進(jìn)行多個相等的值的比對 |
Restrictions.gt() | 對應(yīng)SQL的大于 |
Restrictions.ge() | 對應(yīng)SQL的大于等于 |
Restrictions.lt() | 對應(yīng)SQL的小于 |
Restrictions.le() | 對應(yīng)SQL的小于等于 |
Restrictions.between() | 對應(yīng)SQL的between子句 |
Restrictions.like() | 對應(yīng)SQL的like子句 |
Restrictions.in() | 對應(yīng)SQL的in子句 |
Restrictions.and() | 對應(yīng)SQL的and |
Restrictions.or() | 對應(yīng)SQL的or |
Restrictions.not() | 對應(yīng)SQL的not |
Criteria
criteria
=
session.createCriteria(House.class);
criteria.add(Restrictions.or(
Restrictions.eq("price",
new Double(2300)),
Restrictions.like("title",
"%地鐵%")));
如果屬性條件很多,使用Restrictions
也不方便
Hibernate提供Example
的create()方法來建立Example 實例,Example 實現(xiàn)了Criteria 接口
House
house
=
new House();
house.setPrice(new
Double(2000));
//查詢條件,添加到house對象中
house.setFloorage(new
Integer(40));
SessionFactory
sessionFactory
=
new Configuration().configure().buildSessionFactory();
Session
session
=
sessionFactory.openSession();
Criteria
criteria
=
session.createCriteria(House.class);
criteria.add(Example.create(house));
//通過Example
的create()方法來建立Example
實例作為查詢條件
Hibernate
在自動生成SQL
語句時將自動過濾掉對象的空屬性,根據(jù)有非空屬性值的屬性生成查詢條件
Criteria
查詢不僅能組合出SQL中where子句的功能,還可以組合出排序查詢功能
使用org.hibernate.criterion.Order對結(jié)果進(jìn)行排序
排序的方法為:
asc()
desc()
Criteria
criteria
=
session.createCriteria(House.class);
criteria.addOrder(Order.desc("price"));
//加入Order
條件
以價格降序的方式排列
Criteria
的setMaxResults()方法可以限定查詢返回數(shù)據(jù)的行數(shù)
Criteria
的setFirstResult()設(shè)定查詢返回結(jié)果的第一行數(shù)據(jù)的位置
結(jié)合以上Criteria的兩個方法即可實現(xiàn)簡單分頁
Criteria
criteria
=
session.createCriteria(House.class);
criteria.setFirstResult(3);
//設(shè)定查詢返回結(jié)果的第一行數(shù)據(jù)的位置
//從第4條數(shù)據(jù)開始讀
criteria.setMaxResults(2);
//限定查詢返回數(shù)據(jù)的行數(shù)
//取2條
List
results = criteria.list();
總結(jié)
如何使用Criteria
查詢?
如何使用Example查詢已有實體對象的類似對象?
如何使用Order對Criteria查詢結(jié)果進(jìn)行排序?
如何使用Criteria限定查詢返回的數(shù)據(jù)行數(shù)?
補(bǔ)充:
Example不能以主鍵字段查詢,-->
全返回數(shù)據(jù)
也不會使用like查詢
(eq.()方法)