Hibernate-HQL查询
HQL是hibernate query language的缩写,这是一门面向对象的查询语言,也是hibernate中最常见的查询语言。
(一) HQL的基本语法
|
|
select "属性名" from "对象"
where "条件"
group by "属性名" having "分组条件"
order by "属性名" desc/asc
|
|
注意事项
例子
Select *from User u wher u.id>10 order
by u.id desc ;//心中一定要有对象的概念
(二) 实体对象与动态实例化对象查询
1)
实体对象查询
String executeSql = “from User”;
注意:不需要添加select关键字
2)
动态实例化对象查询
需求:如果我们在实际的情况中,不需要查询出对象的所有字段属性,我们可以采取什么样的方法呢?
Select id , name from user ;
分析:
上述的hql语句只查询了user对象的id,name这两个字段,
但在hibernate中,次语句返回的是Object的数组,他失去了原有的对象状态,
解决方案
Select new User(id,name) from User;
条件查询和别人的使用
在HQL中通过where子句实现条件查询
From User where id = 1;
HQL提供了对象别名的方法
From User u whre u.id = 1;
From User as u wher u.id = 1;//这两种方法都可以,我个人觉得使用第一种的。
(三) HQL语句的动态查询
1, JDBC编程中,PreparedStatement对象为开发提供了方便,不但可以为SQL语句进行动态赋值而且避免了SQL注入式攻击。并且还使用了SQL缓存技术,提高了SQL的执行效率。
2, HQL也采用了相似的方法。
1)
“?”代表参数
此种方式跟PrepareStatement极为相似,通过query对象的方法setParameter()进行赋值
案例:
String hql = “from User u where u.id=?”;
Query query = session.createQuery(hql);
query. = query.setParameter(0,3);
list = query.list();
|
|
自定义参数名
此种方式也是通过Query对象的setParameter方法进行赋值,但是可以自定义HQL语句中的动态参数,他通过”:”号与定义参数组合的方法来实现的
String hql = “from User u where u.id
=:userId”;
Query query = session.createQuery();
qery = query.setParameter(“userId”,3);
list = query.list();
|
|
(四) 对象导航查询
关系模型是通过主外键来建立两张表之间的关系,而面向对象的模型则是引用
Such as
Public class Student {
Private
Teacher teacher = null ;
}
HQL查询符合Java程序员的变成习惯,当一个对象与另外一个对象存在依赖关系时,可以通过”.”符号进行导航。
session = HibernateUtil.getSession();
transaction =
session.beginTransaction();
String hql = "from Medicine m
where m.category.name=?";
Query query =
session.createQuery(hql).setParameter(0,"感冒");
List<Medicine> list =
query.list();
for(Medicine m:list)
{
System.out.println("感冒用品"+m.getName());
}
transaction.commit();
|
|
(五) 排序查询
from User u order by id asc ;//升序
from User u order by id desc ;//降序
|
|
(六)
(七) 聚合函数
Select count() from User u ;
from User u order by id asc ;//升序
from User u order by id desc ;//降序
|
|
Select max(u.id) from User u ;
(八) 分组操作
在HQL中使用group by’子句进行分组操作
|
|
session = HibernateUtil.getSession();
session.beginTransaction();
String hql = "select u.dept
,count(*) from User u group by u.dept";
Query query = session.createQuery(hql);
List<Object> list = query.list();
for(Object[] obj;list){
System.out.println.....
}
transaction.commit();
|
|
(九) 子查询
|
|
session = HibernateUtil.getSession();
transaction =
session.beginTransaction();
String hql = "select med.name from
Medicine med where med.price"(select max(price) from Medicine)";
List<String> list =
session.createQuery(hql).list();
for(String name:list){
System.out.println("最贵的药品为"+name);
}
transaction.commit();
|
|
时间: 2024-08-13 23:12:42