一: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、分页)
(六)方法链
(七)聚集函数
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类型的结果,表示影响的行数