HQL:
CreateQuery()
Query query = session.createQuery("from Customer as c where c.name=:customerName and c.age=:customerAge");
query.setString("customerName","Tom");
query.setInteger("customerAge",21);
createQuery()支持方法鏈編程風格
QBC:(Criteria,Criterion,Expression)
Criteria criteria = session.createCriteria(Customer.class);
Criterion criterion1 = Expression.like("name", "T%");
Criterion criterion2 = Expression.like("age", new Integer(21));
Criteria = criteria.add(criterion1).add(criterion2);
List result = criteria.list();
HQL&&QBC支持多態和繼承查詢
HQL&&QBC支持排序和分頁
HQL: Query query = session.createQuery("from Customer c order by c. name asc, c.age desc"); //排序
query.setFirstResult(10); //設定從對象開始檢索起始位置為0
query.setMaxResults(10); //設定一次最多檢索出的對象數目
QBC: Criteria criteria = session.createCriteria(Customer.class);
criteria.addOrder(Order.asc("name"));
criteria.addOrder(Order.desc("age"));
criteria.setFirstResult(0); //設定從對象開始檢索起始位置為0
criteria.setMaxResult(10); //設定一次最多檢索出的對象數目
參數綁定能有效避免一些安全漏洞
HIbernate還能在xml文件里面配置HQL或者SQL本地查詢語句:
//for HQL
<hibernate-mapping>
<class name="mypack.Customer" table="CUSTOMERS">
...
</class>
<query name="findCustomersByName"><![CDATA[from Customer c where c.name like :name]]></query>
</hibernate-mapping>
//for SQL
<sql-query name="findCustomersByName"><![CDATA[select {c.*} from CUSTOMERS c where c.NAME like :name]]>
<return alias="c" class="Customer"/>
</sql-query>
在程序中使用getNamedQuery()方法獲得查詢語句:
Query query = session.getNamedQuery("findCustomersByName");
query.setString("name",name);
List result = query.list();
內連接:利用內連接可獲取兩表的公共部分的記錄Select * from A JOIN B ON A.Aid=B.Bnameid
當查詢的只是對象的部分屬性的時候, 可以采用動態實例化查詢結果,把實體的部分屬性封裝為一個javabean臨時對象,不需要創建對象-關系映射文件
package mypack;
import java.io.Serializable;
public class CustomerRow implements Serializable{
private Long id;
private String name;
private String orderNumber;
public CustomerRow(Long id, String name, String orderNumber){
this,id=id;
...
}
...
此處省略id,name和orderNumber屬性的get和set方法
...
}
在程序中可以結合HQL查詢語句這樣使用,
Iterator it = session.createQuery("select new mypack.CustomerRow(c.id,c.name,o.orderNumber)'
+'from Customer c join c,orders o where o,orderNumber like 'T%'").list().iterator();
此外如果結果集只有一個結果,可以用uniqueResult()方法
Object[] obj = (Object[])session.createQuery("select max(c.age),min(c.age) from Customer c").uniqueResult();
Integer maxAge = (Integer) obj[0];
Integer minAge = (Integer) obj[1];
結果集中可以通過利用set和sql的distinct去掉
動態查詢適宜用QBC檢索方式,可以簡化編程:
public List findCustomers (String name, int age) throws HibernateException{
Criteria criteria = session,createCriteria(Customer,class);
if(name != null){
criteria.add(Expression.like("name",nam.toLowerCase(),MactchMode.ANYWHWERE));
}
if(age!=0){
crteria.add(Expression.eq("age",new Integer(age)));
}
return criteria.list();
}
集合過濾: 當orders集合由于使用延遲檢索策略而沒有在開始被初始化,當調用get***().iterator()方法初始化的時候不能對這個集合進行排序或者條件過濾,通過使
用集合過濾就能解決這個問題:
List result = session.createFilter(customer.getOrders(), "where this.price>100 order by this.price") .list();
集合過濾除了用于為集合排序或設置約束條件,還可以:
1) 為集合分頁
List result = session.createFilter(customer.getOrders(), "order by this,price asc")
.setFirstResult(10)
.setMaxResult(50)
.list();
2)只選擇集合的某個屬性
List result = session.createFilter(customer.getOrders(), "select this.orderNumber").list();