HQL查询
HibernateQuery Language,Hibernate的独家查询语句。查询功能很强大,可以完成很多的功能。
更多详细用法可以参考官方的pdf文档:hibernate_reference.pdf
实例说明:
1,查询所有
//事务操作,HQL查询,查询所有Person对象
Queryquery = session.createQuery("from Person");
List<Person>personList = query.list();
for(Personp : personList) {
System.out.println(p);
}
==================我是分割线====================
2,模糊查询
//事务操作,HQL查询,模糊查询
Queryquery = session.createQuery("from Person as pwhere p.username like '%1%'");
List<Person>personList = query.list();
for(Personp : personList) {
System.out.println(p);
}
==================我是分割线====================
3,查询指定的用户(验证用户登录时)
Queryquery = session.createQuery("from Person as pwhere p.username = 'user1' and p.password = 'pwd1'");
List<Person>personList = query.list();
for(Personp : personList) {
System.out.println(p);
}
==================我是分割线====================
4,部分查询,Person类必须提供相应的构造方法
Queryquery = session.createQuery("selectp.username,p.password,p.id from Person as p");
List<Object[]>personList = query.list();
/*
* 注意,这里查询出来的每一个对象都是Object[],其中数组的第1个元素代表了p.username的查询结果,
* 第2个元素代表了p.password的查询结果,
* 第3个元素代表了p.id的查询结果,
*/
for(Object[]obj : personList) {
//从这里可以看出
System.out.println(obj[0]+"--"+obj[1]+"--"+obj[2]);
}
==================我是分割线====================
5,分页查询
/*
* 用到了query.setFirstResult(int)和query.setMaxResult(int)方法,
* 第一个方法指定了从第几个元素开始检索,默认从0开始。
* 第二个方法指定了每次最多检索出多少个对象默认检索出所有对象,
*/
//通过order by 语句可以指定按列的升序(asc)|降序(desc)排序查询
Queryquery = session.createQuery("selectp.username,p.password,p.id from Person p order by p.id asc");
query.setFirstResult(5);//因为索引从0开始,所以这里表示从第6条开始检索
query.setMaxResults(5);//每次检索出5个对象。
List<Object[]>personList = query.list();
for(Object[]obj : personList) {
//从这里可以看出
System.out.println(obj[0]+"--"+obj[1]+"--"+obj[2]);
}
==================我是分割线====================
6,绑定参数查询,通过 ? 指定
Queryquery = session.createQuery("from Person p wherep.username like ?");
//通过query的setParameter方法,设置?代表的值,0代表设置第一个 ? ,后面是查询条件
query.setParameter(0,"%2%");
List<Person>personList = query.list();
for(Personp : personList) {
System.out.println(p);
}
==================我是分割线====================
7,绑定参数查询,通过 “:指定查询名” 指定
Queryquery = session.createQuery("from Person p wherep.username like :username");
//第一个参数是字符串类型,必须与冒号 : 后面的名字一致,第二个参数是查询条件
query.setString("username","%2%");
List<Person>personList = query.list();
for(Personp : personList) {
System.out.println(p);
}
==================我是分割线====================
8,使用聚合函数
//Query query = session.createQuery("select count(*) fromPerson");
Queryquery = session.createQuery("selectmin(p.id),max(p.id) from Person p");
//query.setString("username", "%2%");
Object[]result = (Object[]) query.uniqueResult();
System.out.println(result[0]+"--"+result[1]);
==================我是分割线====================
9,分组
Listlist=session.createQuery("select c.name,count(c)from Customer c
group by c.name").list();
System.out.println(list.size());
for(inti=0;i<objects.size();i++){
Object[] o = objects.get(i);
System.out.print(o[0]+”--”+o[1]);
System.out.println();
}
==================我是分割线====================
链接查询:
程序中指定的连接查询类型 | HQL语法 | 适用范围 |
内连接 | inner join | join | 适用于由关联关系的持久化类 |
迫切内连接 | inner join fetch | join fetch | |
隐式内连接 |
| |
左外连接 | left outer join left join | |
迫切左外连接 | left outer join fetch left join fetch | |
右外连接 | right outer join | outer join | |
交叉连接 | ClassA,ClassB | 适用于不存在关联关系的持久化类 |
10,迫切左外连接
//left outer join fetch 表示迫切左外连接检索策略
//Query方法返回的集合中存放Customer对象的引用,每个Customer对象的orders
//集合都被初始化
Query query=session.createQuery("from Customer c left outer join fetch
c.orders owhere c.name=?");
query.setString(0, "tom");
List<Customer> list = query.list();
==================我是分割线====================
11,左外连接
//left outer join 左外连接,使用左外连接查询时,将根据映射文件的配置来决定
// orders集合的检索策略 返回是对象数组
Query query = session.createQuery("from Customer c left outer join
c.orders o where c.name like 'T%'");
List list = query.list();
==================我是分割线====================
12,内连接
HQL查询:默认检索的是成对的对象Customer和Order。返回是对象数组
// inner join 表示内连接检索策略
Queryquery = session.createQuery("from Customer cinner join
c.orders o where c.name like 'T%'");
Listlist = query.list();
==================我是分割线====================
13,迫切内连接
//Inner join fetch表示迫切内连接检索策略 ,也就是覆盖映射文件中指定的检索策略
Queryquery = session.createQuery("from Customer cinner join fetch
c.orders o where c.name like 'T%'");
Listlist = query.list();
==================我是分割线====================
14,右外连接
HQL: right outer join 右外连接 返回是对象数组
Queryquery = session.createQuery("from Customer c
right outer join c.orders owhere c.name like ‘t%'");
Listlist = query.list();
==================我是分割线====================
15,命名查询
//在hbm.xml文件添加query查询语句
<class>
.......
</class>
<query name="findCustomersByName">//为该查询语句起一个名字
<![CDATA[fromCustomer c where c.name like ?]]>
</query>//将查询语句定义在这里,
------------------------------------------------------------------
//这里为测试类,
//通过getNamedQuery方法可以调用已经在hbm.xml文件中命名的HQL语句
query= session.getNamedQuery(“findCustomersByName”);
query.setString(0,”%T%”);
query.list();