HQL查询

来源:互联网 发布:ios开发语言 java 编辑:程序博客网 时间:2024/06/04 19:05

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

原创粉丝点击