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();