现在有两张表:student(学生表),classroom(教室表).

//对象 Student 对应 student 表中有四个字段,分别是:id,name,age,classroom;
public class Student
{
  private int id;
  private String name;
  private int age;
  private Classroom classroom;
} //对象Classroom 对应 classroom 表中有两个字段:id,name,students;
public class Classroom
{
private int id;
private String name;
private Set<Student> students;
}

Student 是一个对象,student 是数据库中的一个表.

查询所有的Student对象时,最简单的HQL语句是: from Student,也可以写成 select s from Student (as) s. 注:这的as可以省略

1.简单的查询遍历对象:

 // 遍历Student
Query query = session.createQuery("form Student");
// 注: 如果Student对象不是唯一的,那么需要写上包名,如: from test.Student test为包名.
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Student stu = (Student) list.get(i);
System.out.println(stu.getName());
}
// 注意:
// 如果执行HQL语句"from Student,Course",并不时单单返回两个对象,而是返回两个对象的笛卡尔积,这类似SQL语句中字段的全外连接.实际的应用中,"from Student,Course"这种语句几乎是不回出现的.

2.属性查询:

 // ----单个属性查询:
Query query = session.createQuery("select s.name form Student s");
List list = query.list();
for (int i = 0; i < list.size(); i++) {
String name = (String) list.get(i);
System.out.println(name);
} // ----多个属性查询:
Query query = session.createQuery("select s.name,s.age form Student s");
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Object obj[] = (Object[]) list.get(i); // 取得list中的第i个对象
System.out.println(obj[0] + "的年龄为: " + obj[1]);
}

3.实例化查询:

 // 实例化查询结果可以说是对属性查询的一重改进.在使用属性查询时由于使用对象数组,操作和理解不太方便,
// 如果将以个Object[]中的成员封装成一个对象就方便多了.
Query query = session.createQuery("select new Student(s.name,s.age) form Student s");
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Student stu = (Student) list.get(i);
System.out.println(stu.getName());
} // 注:运行这个程序的时候,需要一个new Student(s.name,s.age)构造函数.在Student.java中编写这个构造函数.
public Student(String name, int age) {
this.name = name;
this.age = age;
}

4.动态参数查询:

1)、基于 ? 的参数形式

 /*
* setParameter的方式可以防止sql注入 jdbc的setParameter的下标从1开始,hql的下标从0开始
*/
Query query = session.createQuery("select stu from Student stu where name like ? ");
query.setParameter(0, "%张三%");
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Student stu = (Student) list.get(i);
System.out.println(stu.getName());
}

2)、基于 :xx 的别名参数形式

 /*
* 通过 :xxx 格式设置别名
*/
Query query = session.createQuery("select stu from Student stu where name like :name ");
query.setParameter("name","%李四%");
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Student stu = (Student) list.get(i);
System.out.println(stu.getName());
}

注意:如果返回结果只有一个,可以在 Query 后使用 uniqueResult 方法  e.g.: query.uniqueResult();

in 查询: "from Student where id in (:ids)" 传入参数使用 query.setParameterList("ids", new Integer[] { 1, 2 });

5.分页查询:

  在 Query 后 使用 setFirstResult(x) 方法设置从第x条开始取,使用 setMaxResults(y) 方法设置取出y条数据  query.setFirstResult(0).setMaxResults(10);

6.连表查询:

1: inner jion (内连接); inner jion 可以简写为join
2: left outer join (左外连接)
3: right outer join(右外连接)
4: full join(全连接--不常用)

 /*
* inner join
* sql 与 hql 区别:
* sql: select s.* from Student s join Classroom c on s.cid=c.id
* hql: select s from Student s join s.classroom room
*/
Query query = session.createQuery("select s from Student s join s.classroom room where room.id=2");
List list = query.list();
for (int i = 0; i < list.size(); i++) {
Student stu = (Student) list.get(i);
System.out.println(stu.getName());
}

7.聚合函数查询:

 //1: count() 统计记录的条数
//2: min() 求最小值
//3: max() 求最大值
//4: sum() 求和
//5: avg() 求平均值
// 取得Student的数量
Query query = session.createQuery("select count(*) from Student"); // avg()取得Student平均年龄
query = session.createQuery("select avg(s.age) from Student as s"); // upper()方法将字符串转为大写
query = session.createQuery("select upper(s.name) from Student as s"); // 去除重复行distinct
query = session.createQuery("select distinct s.age from Student as s");

8.子查询:

 //all 表示所有记录
//any 便是所有记录中的任意一条
//somy 与any用法一样
//in 等价于any
//exists 表示子查询至少要返回一条数据. //all:
from Team t where 22 < all(select s.age from Student s) from Team t where all(select s.age from t.student s) > 22

9.修改update()

 Student stu=(Student)session.get(Student.class,"id");      //根据id 得到stu对象
stu.setName("123");
session.update(stu);

10.删除:delete()

 Student stu=(Student)session.get(Student.class,"id");      //根据id 得到stu对象
session.delete(stu);

HQL(Hibernate Query language)语言的更多相关文章

  1. hql(Hibernate Query Language)

    1.Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate ...

  2. Hibernate查询(HQL——Hibernate Query Language)

    HQL查询 HQL提供了是十分强大的功能,它是针对持久化对象,用取得对象,而不进行update,delete和insert等操作.而且HQL是面向对象的,具备继承,多态和关联等特性. from子句: ...

  3. 常用HQL(Hibernate Query Language)查询

    查询一个对象(实体类必须有一个不带参数的构造方法) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Test public void test01() ...

  4. Hibernate Query Language查询:

    Hibernate Query Language查询: Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供 ...

  5. HQL: The Hibernate Query Language

    Chapter 14. HQL: The Hibernate Query Language 14.1. Case Sensitivity 14.2. The from clause 14.3. Ass ...

  6. HQL(Hibernate Query Language)

    1. NativeSQL > HQL > EJB QL(JP QL 1.0) > QBC(Query By Criteria) > QBE(Query By Example)2 ...

  7. Hibernate hql(hibernate query language)基础查询

    在开发过程中,数据库的操作我们其实更多的用到的是查询功能,今天开始学习hql的查询. 1.加入必要的工具 2.Hibernate配备的一种非常强大的查询语言,这种查询语言看上去很像sql.但是不要被语 ...

  8. HQL基础Query简单查询结果for输出和Iterator输出

    HQL第一次课: hibernate Query Language:hibernate 查询语言 语法: query: String hql="from dept"; Query ...

  9. 类型:。net;问题:HQL;结果:HQL: Hibernate查询语言

    HQL: Hibernate查询语言 Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL.但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可 ...

随机推荐

  1. 环形队列C++实现

    大家好,我是小鸭酱,博客地址为:http://www.cnblogs.com/xiaoyajiang 以下鄙人用C++实现了环形队列 /******************************** ...

  2. C语言实现的OOP

    我倒不是为了OOP而OOP,实在是OOP的一些特征,例如封装,多态其实是软件工程思想,这些思想不分语言,遵循了这些思想可以使得程序更有弹性,更易修改和维护,避免僵化,脆弱 shape.h 该文件定义的 ...

  3. Qt读取ANSI格式文件——利用QTextCodec将其他编码格式转换为Unicode格式

    Qt使用Unicode来表示字符串.但是通常需要访问一些非Unicode格式的字符串,例如打开一个GBK编码的中文文本文件,甚至一些非Unicode编码的日文,俄文等. Qt提供了QTextCodec ...

  4. 《Programming WPF》翻译 第5章 8.我们进行到哪里了?

    原文:<Programming WPF>翻译 第5章 8.我们进行到哪里了? 样式支持你定义一个策略来设置可视化元素的依赖属性.属性的设置可以被命名以及手动或者编程方式地通过名称应用,或者 ...

  5. VS2010的调试参数/Zi /DEBUG

    /DEBUG只是是否要生成调试信息的开关.这个命令行选项在链接器页面那里 /Zi只是生成的调试信息的格式,这个格式是.pdb文件.当然还有好几种格式.这个命令行在编译页那里 如果上面的选项没有设置对, ...

  6. 理解class.forName()(转)

    使用jdbc方式连接数据库时会使用一句代码Class.forName(String className).这句话是什么意思呢?首先说一点Class.forName(String className)这 ...

  7. KDTree详解及java实现

    本文内容基于An introductory tutoril on kd-trees 1.KDTree介绍 KDTree根据m维空间中的数据集D构建的二叉树,能加快常用于最近邻查找(在加快k-means ...

  8. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅶ(延伸:堆排序的实现)

    2.4.5 堆排序 我们可以把任意优先队列变成一种排序方法.将所有元素插入一个查找最小元素的有限队列,然后再重复调用删除最小元素的操作来将他们按顺序删去.用无序数组实现的优先队列这么做相当于进行一次插 ...

  9. Linux usb子系统(三):通过usbfs操作设备的用户空间驱动

    内核中提供了USB设备文件系统(usbdevfs,Linux 2.6改为usbfs,即USB文件系统),它和/proc类似,都是动态产生的.通过在/etc/fstab文件中添加如下一行:none /p ...

  10. 人物角色群体攻击判定(三)Physics.OverlapSphere(群体攻击)

    使用Physics.OverlapSphere来检测不方便调试, 其他都可以.   核心代码: //检测敌人 public void CheckEnemy() { Collider[] cols = ...