HQL是Hibernate自带的查询语言
HQL是一种面向对象的查询语言。SQL的操作对象是数据表和列等数据对象,而HQL的操作对象是类、实例、属性等。
HQL的语法很像SQL的语法
以下举例均以学生类为例:Students.java
1.from子句
规则: from + 持久化类的类名
2.select子句
规则:select + 持久化类中属性名(可以多个或一个) + from子句。。。
下面说一下Select子句的不同返回类型
①Object[]----默认的
②以List
③以map
④自定义
⑤distinct关键字
3.where子句
首先说一下Query两种参数传递方式
①使用‘?’占位
②使用变量名
下面是where子句中的应用(因为跟sql类似就不举例)
①比较运算
= <> < > <= >=
null值判断:is null is not null
HQL中可以写 x = null; / x <> null; 会自动转换成相应sql
②范围运算
in() / not in()
between 值1 and 值2
③字符串匹配
like关键字
通配符:"%"---任意字符
"_"---一个字符
④逻辑运算
and or not
⑤集合运算
is empty /is not empty
member of
⑥四则运算
+ - * /
4.order by子句
同sql:对查询结果排序
desc:降序
esc:升序(默认)
5.分组: Group By ... Having
在having子句中不能使用列别名
在orderby子句中可以使用列别名
6.聚集函数
count(), max(), min(), avg(), sum()
7.查询单个对象
8.连接查询
HQL是一种面向对象的查询语言。SQL的操作对象是数据表和列等数据对象,而HQL的操作对象是类、实例、属性等。
HQL的语法很像SQL的语法
以下举例均以学生类为例:Students.java
- private String name;
- private int age;
- public Students(){
- }
- public Students(String name,int age){
- name = this.name;
- age = this.age;
- }
- //get/set方法
- //。。。。
1.from子句
规则: from + 持久化类的类名
- //Students 是学生类,直接这么写就可以查询出Students持久化类对应于数据库表中的所有信息
- //select可以省略.
- String hql = "from Students";
- String hql = "from Students as s";//使用别名
- String hql = "from Students s";//别名可以省略
- Query query = getCurrentSession().createQuery(hql);
- //注意:当省略select子句时,直接使用from子句来查询全部,query.list()返回的是该持久化类型的List
- List<Students> studentsList = query.list();
2.select子句
规则:select + 持久化类中属性名(可以多个或一个) + from子句。。。
- //hql中不可以写 select * 这个实际上是相当于 form Students
- hql = "select s from Students as s";//相当于 from Students
- hql = "select s.name from Students as s";//只查询一列,返回List<Object>
- hql = "select s.name,s.age from Students as s";//查询多列,返回List<Object[]>
- hql = "select new Students(s.name,s.age) from Students as s"//自定义返回类型,返回List<Students>,同时在Students.java持久化类中要有相应的构造器和无参构造器
- hql = "select distinct s.name from Students s"//distinct关键字,返回List<Object>
下面说一下Select子句的不同返回类型
①Object[]----默认的
②以List
③以map
④自定义
⑤distinct关键字
- //默认的List<Object[]> 返回,此时需要查询多个属性,一个属性的查询返回的是List<Object>
- hql = "select s.name,s.age from Students s";
- List<Object[]> list = query.list();
- //查询一个属性
- hql = "select s.name from Students s";
- List<Object> list = query.list();
- //以list返回
- hql = "select new List (s.name,s.age) from Students s";
- List<List> list = query.list();
- //以map返回:如果查询字段属性不设别名则key值以序号显示,查询属性使用别名,key值以别名显示
- hql = "select new map(name,age) from Students";
- List<Map> list = query.list();
- list.get(0).get("0");//没有别名时,key以序号命名
- hql = "select new map(s.name,s.age) from Students s";
- list.get(0).get("name");//通过别名来获取
- //以自定义的构造器返回:持久化类中必须声明了该构造器和无参构造器
- hql = "select new Students(s.name,s.age) from Students s";
- List<Students> list = query.list();
- //以distinct关键字返回
- hql = "select distinct s.name from Students s";
- List<Object> list = query.list();//因为是一个字段所有返回List<Object>
3.where子句
首先说一下Query两种参数传递方式
①使用‘?’占位
- hql = "from Students where name = ? ";
- Query query = getCurrentSession().createQuery(hql);
- query.setParameter(0,"张三",Hibernate.STRING);
- //第一个参数:表示是第几个'?',从0开始
- //第二个参数:表示实际查询的内容
- //第三个参数:表示该参数的类型(可以省略)
②使用变量名
- hql = "from Students where name = :NAME ";
- Query query = getCurrentSession().createQuery(hql);
- query.setParameter("NAME","张三",Hibernate.STRING);
- //第一个参数:与hql中':'后的变量名对应
- //第二个参数:表示实际查询的内容
- //第三个参数:表示该参数的类型(可以省略)
- //当参数是集合时,一定要使用setParameterList()设置参数值
- hql = "from Students s where name in (:NAME)";
- Query query = getCurrentSession().createQuery(hql);
- query.setParameterList("NAME", new Object[] { "张三","李四"});
下面是where子句中的应用(因为跟sql类似就不举例)
①比较运算
= <> < > <= >=
null值判断:is null is not null
HQL中可以写 x = null; / x <> null; 会自动转换成相应sql
②范围运算
in() / not in()
between 值1 and 值2
③字符串匹配
like关键字
通配符:"%"---任意字符
"_"---一个字符
④逻辑运算
and or not
⑤集合运算
is empty /is not empty
member of
⑥四则运算
+ - * /
4.order by子句
同sql:对查询结果排序
desc:降序
esc:升序(默认)
5.分组: Group By ... Having
在having子句中不能使用列别名
在orderby子句中可以使用列别名
- hql = "select s.name,count(s.age) from Students s where s.age > 10 group by s.name having count(s.age) > 1 order by s.age";
6.聚集函数
count(), max(), min(), avg(), sum()
7.查询单个对象
- hql = "from Students where name = '"张三"'";
- Query query = session.createQuery(hql);
- Students student = query.uniqueResult();
- //当查询结果不唯一时,会抛出异常。
8.连接查询