HQL:Hibernate Query Language,完整的HQL语法结构如下:
[select/update/delete...] [from...] [where] [group by... [having]] [order by...]
结构上看上去很像SQL,但HQL是非常有益使得被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的概念。
实体查询(表)
String hql = "from TUser"; //select ... from T_User;
Query query = session.createQuery(hql);
List userList = query.list();
查询的目标实体存在着继承关系的判定,此例将返回所有TUser以及TUser子类的记录。
返回数据库所有库表的记录:"from java.lang.Object"
Where子句,类似SQL。
例:"from TUser as user where user.name='Erica'" -------as为类名创建别名, 可以省略。
属性查询(表字段)
List list = session.createQuery("select user.name from TUser user ").list();
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next()); //返回的list数据结构中,每个条目都是一个String类型的name数据(而非TUser对象)
}
List list = session.createQuery("select user.name,user.age from TUser user ").list();
Iterator it = list.iterator();
while(it.hasNext()){
Object[] results = (Object[])it.next();
System.out.println(results[0]); //name
System.out.println(results[1]);//age
}
动态构造对象实例
List list = this.session.createQuery("select new TUser(user.name,user.age) from TUser as user ").list();
Iterator it = list.iterator();
while(it.hasNext()){
TUser user = (TUser)it.next(); //普通java对象,除了在构造时赋予的属性值外,其他属性均未赋值。
System.out.println(user.getName()); //name
}
List list = this.session.createQuery("select new TUser(user.name,user.age) from TUser as user ").list();
Iterator it = list.iterator();
while(it.hasNext()){
TUser user = (TUser)it.next(); //普通java对象,除了在构造时赋予的属性值外,其他属性均未赋值。
user.setName("test");
session.saveOrUpdate(user); //insert not update.
}
实体更新与删除
Transaction tx = session.beginTransaction();
String hql = "update TUser set age = 18 where id = 1";
// String hql = "delete TUser where age > 18";
Query query = session.createQuery(hql);
int ret = query.executeUpdate();
System.out.println("Update Records =>" + ret);
//System.out.println("Delete Records =>" + ret);
tx.commit();
注意:对缓存策略的影响。
HQL已越来越接近传统的SQL,在对象型数据库尚不成熟的今天(现在还是关系型数据库),通过面向对象的查询语言对关系型数据库进行访问,既满足了上层结构中面向对象设计的需求,也充分利用了现有技术平台,Hibernate(O/R)。
Order by字句
from TUser user order by user.name,user.age desc
Group by子句
Having 子句是针对Group by返回结果集的筛选语句,等同于where子句之于库表。
select count(user),user.age from TUser user group by user.age having count(user)>10
参数绑定
顺序占位符(?)
Query query = session.createQuery(from TUser user where user.name=? and user.age=?);
query.setString(0,"Erica"); // begin with 0
query.setInteger(1,20);
引用占位符
String hql = "from TUser where name=:name";
Query query = session.createQuery(hql);
query.setParameter("name","Erica");
可以使用JavaBean封装查询参数,query.setProperties(javabeanObject);
引用查询(代码终不允许出现SQL语句)
联合查询
HQL中的inner join,left outer join,right outer join,full join(not usually useful)分别与ANSI SQL中同名术语一一对应。
子查询
from TUser user where (select count(*) from user.addresses) > 1