一:HQL:Hibernate Query Language

特点:

1. 与SQL语句相似,SQL中的语法基本上都可以直接使用

2. SQL查询的是表和表中的列;HQL查询的是对象与对象中的属性

3. HQL的关键字不区分大小写,类名和属性名区分大小写

4. SELECT可以省略

二:HQL查询 :(尽量使用别名)

(一)简单的查询

hql="FROM User";(当hbm.xml文件中class标签的auto-import属性(HQL中写类的简单名称时是否自动导入全限定名)设置为false时,'User'要改写为全类名)

(二)带上过滤条件(可以使用别名,可省略as关键字):where

hql="FROM User u WHERE u.uid > 10 AND u.uid < 15";  //u.uid可以换成uid,不受别名影响

(三)带上排序条件:order by

hql="FROM User u WHERE u.uid > 10 ORDER BY u.username DESC, u.uid ASC";

(四)指定select子句(不可以使用select *)

相当于"FROM User"

查询指定列,返回的集合的类型是该属性的类型

查询多个列,返回的集合的类型是Object数组(数组中的顺序与查询顺序对应)List<Object[ ]>,一般通过Arrays.toString( (Object[ ]) obj )处理之后再打印;针对这种情况,我们可以使用new语法,把查询出来的部分数据封装到对象中

中要有指定参数的带参构造

(五)执行查询,获得结果(list、uniqueResult、分页)

Query query = session.createQuery("FROM User u");
query.setFirstResult(0); 相当于limit index,pageSize中的index
query.setMaxResult(10); 相当于limit index,pageSize中的pageSize
List list = query.list(); 获取列表
query.uniqueResult(); 查询的是唯一的结果(当结果不唯一时,会抛异常)

(六)方法链

List list = session.createQuery("FROM User u").setFirstResult(0).setMaxResult(10).list();n
List list = session.createQuery(//
"FROM User u")//
.setFirstResult(0)//
.setMaxResult(10)//
.list();
//----------------------- 进阶

(七)聚集函数

hql="SELECT COUNT(*) FROM User u";  count返回Long型数据

(八)分组 group by ... having ...  (select之后一般写的是group by之后的内容或者聚集函数)

hql="SELECT u.username,COUNT(u.uid)" +

"FROM User u WHERE u.uid < 9" +

"GROUP BY u.username" +

"HAVING COUNT(u.uid) > 2" +

 "ORDER BY COUNT(u.uid) DESC";

或使用别名:(在having中不能使用列别名,order by中可以使用列别名)

hql="SELECT u.username,COUNT(u.uid) AS c " +

"FROM User u WHERE u.uid < 9 " +

"GROUP BY u.username " +

"HAVING COUNT(u.uid) > 2 " +

"ORDER BY c DESC";

(九)连接查询 / HQL是面向对象的查询

>>内连接(inner关键字可以省略)

hql="SELECT u.uid,s.sname FROM User u INNER JOIN u.skill s";  直接把用户名和技能一起查询出来

>>左外连接(outer关键字可以省略)

 hql="SELECT u.uid,s.sname FROM User u LEFT OUTER JOIN u.skill s";

>>右外连接(outer关键字可以省略)

hql="SELECT u.uid,s.sname FROM User u RIGHT OUTER JOIN u.skill s";

>>超级连接

hql="SELECT u.uid,u.skill.sname FROM User u";

(十)查询时使用参数

>>方式一:使用"?"占位符(除了JDBC中,所有占位符的索引值都是从0开始)

hql="FROM User u WHERE u.uid BETWEEN ? AND ?";(between...and...包含边界值)

List list = session.createQuery()

.setParameter(0,5)  //将第一个占位符的值设置位5

.setParameter(1,10)  //将第二个占位符的值设置位10

.list();

>>方式二:使用变量名(格式: “:变量名”)

hql="FROM User u WHERE u.uid BETWEEN :uidMin AND :uidMax";

List list = session.createQuery()

.setParameter("uidMin",5)  //将第一个变量名的值设置位5

            .setParameter("uidMax",10)  //将第二个变量名符的值设置位10

.list();

当参数是集合时:(只能用变量名的方式结合setParameterList方法 )

hql="FROM User u WHERE u.uid IN (:uids)";

List list = session.createQuery()

            .setParameterList("uids",new Object[ ] { 1,2,3 })

            .list();

(十一)使用命名查询(queryByRange是在hbm.xml文件中定义的查询名)

    

List list = session.getNamedQuery("queryByRange")

将第一个占位符的值设置位5

将第二个占位符的值设置位10

            .list();

或:

List list = session.getNamedQuery("queryByRange")

将第一个变量名的值设置位5

将第二个变量名的值设置位10

            .list();

(十二)update和delete,不会通知session缓存(所以修改之后不会通知session缓存,只有通过refresh(obj)方法才能更新session中的对象为最新对象)

在update或delete之后需要refresh(obj)一下来获取最新的状态

int i = session.createQuery("UPDATE User u SET u.username=? WHERE u.uid>5")

            .setParameter(0,"newName")

返回int类型的结果,表示影响的行数

int i = session.createQuery("DELETE User u  WHERE u.uid>5")

.setParameter(0,"newName")

.executeUpdate();  //返回int类型的结果,表示影响的行数