HQL查询方式是Hibernate3中极力推荐使用的功能强大的数据检索方式
- Query对象
创建一个新的Query实例
可以调用session的createQuery方法(创建一个HQL查询)
Query hqlQuery = session.createQuery("from User");
或者createSQLQuery方法(创建一个本地SQL查询)
Query sqlQuery = session.createSQLQuery( "select {u.*} from USERS {u}", "u",User.class);
list()方法执行查询并返回一个List集合:
List result = session.createQuery("from User").list();
Query接口支持查询结果分页
Query query = session.createQuery(“
from User u order by u.name asc");
//从第一行开始,提取前10个对象(记录)
query.setFirstResult(0);
query.setMaxResults(10);//当前页显示多少页
List result = query.list();
list()方法执行查询并返回一个List集合:
List result = session.createQuery("from User").list();
如果知道返回的集合中只有一个对象,可以用result.get(0)取出对象,或者使用以下方法进行
User user = (User) session.createQuery(
"from User u order by u.account desc“)
.setMaxResults(1)
.uniqueResult();
绑定任意参数
Query接口提供了许多方法用于参数绑定,例如setString()、setDate()、setInteger() 等
一个特别有用的方法是setEntity(),它可以让你绑定一个持久对象:
Query query = session.createQuery("from Item item
where item.seller = :seller")
query.setEntity("seller", seller)
query.list();
基本对象查询(cont.)
使用别名
可以给被查询的类赋一个别名。例如:
from User as u 或者
from User u
有了别名,就可以在同一个查询的其它部分来引用被查询的类
使用约束(查询条件)
获得一个持久类的特定实例。例如:
from User u where u.email = ‘my@yahoo.com'
其中,email是User类的一个属性
比较运算符
HQL支持:=, <>, <, >, >=, <=, between, not between, in, not in
例如:
from Score s where s.score between 60 and 100
from Score s where s.score > 60
from User u where u.email in ( "foo@hibernate.org", "bar@hibernate.org" )
null操作符
例如:
from User u where u.email is null
该查询返回没有email地址的所有user对象
再如:
from User u where u.email is not null
该查询返回具有email地址的所有user对象
HQL的where子句支持算术表达式
from Score s where ( s.midterm*0.3+s. terminal *0.7 )> 60.0
逻辑操作符
有and、or。例如:
from User user where user.firstname like "G%" and user.lastname like "K%“
from User user where ( user.firstname like "G%" and user.lastname like "K%" ) or user.email in ( "foo@hibernate.org", "bar@hibernate.org" )
查询结果排序
使用order by子句。例如:
from User u order by u.username
使用asc或desc指定升序或降序。例如
from User u order by u.username desc
使用多个属性排序。例如:
from User u order by u.lastname asc, u.firstname asc
如果不需要获得完整的实体对象,只需要实体对象的某个属性,例如,在一个下拉框中显示的用户名,用HQL也很简单。
Query query = session.createQuery(“select account
from User u where u.loginNums>10")
List accounts=query.list(); //返回值是String的集合
也可以返回部分属性
Listresult= session.createQuery(
"select d.id,d.title from Department d").list();
for(Object[] obj:result){
System.out.println(obj[0]+","+obj[1]);
}
链接查询
通过连接运算符可以实现多个表查询。连接可以在SELECT 语句的FROM子句中建立。 SQL-92标准所定义的FROM子句的连接语法格式为:
FROM join_table join_type join_table
[ON (join_condition)]
join_table指出参与连接操作的表名。连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接
join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接
内连接
from Student s join s.department d
左外连接
from Student s left join s.department d
右外连接
from Student s right join s.department d
交叉连接
from Student s ,s.department d
注:如果需要带连接条件 ,用with子句
在Hibernate应用中使用QBC查询通常经过3个步骤:
使用Session实例的createCriteria ()方法创建Criteria对象;
使用工具类Restrictions的相关方法为Criteria对象设置查询条件;
使用Criteria对象的list()方法执行查询,返回查询结果;
查询所有客户
Session session = HibernateSessionFactory.getSession();
Transaction ts = null;
//创建一个Transaction对象
ts = session.beginTransaction();
//创建一个Query查询对象
Criteria criteria = session.createCriteria(Customers.class);
List list = criteria.list();//装载QBC查询结果
查询单个用户
//创建一个Criteria查询对象
Criteria criteria = session.createCriteria(Customers.class);
//使用Restrictions工具类提供的方法eq,设置id属性等于1
criteria.add(Restrictions.eq("id",new Integer(1));
criteria.setMaxResults(1);//设置最大检索数为1
Customers customers = (Customers)criteria.uniqueResult();
//装载单个对象结果
对查询结果进行排序
Criteria criteria = session.createCriteria(Customers.class);
//使用Order工具类提供的方法进行排序
criteria.addOrder(Order.asc("cname");
List list = criteria.list();//装载QBC查询结果
分组查询
Criteria criteria = session.createCriteria(Customers.class);
//创建ProjectionList
ProjectionList pList = Projections.projectionList();
//创建分组,按客户名分组
pList.add(Projections.groupProperty("cname"));
pList.add(Projections.rowCount());//统计分组记录数
criteria.setProjection(pList);//为criteria对象设置Projections
List list = criteria.list();//装载QBC查询结果