首页 > 代码库 > Hibernate-HQL查询

Hibernate-HQL查询

Hibernate-HQL查询

HQL是hibernate query language的缩写,这是一门面向对象的查询语言,也是hibernate中最常见的查询语言。

(一)   HQL的基本语法

 
 

select "属性名" from "对象"

where "条件"

group by "属性名" having "分组条件"

order by "属性名" desc/asc

 

 

 

 

 

 

 

注意事项

  • 大小写敏感
  • 尽量避免使用DML语句操作数据

例子

Select *from User u wher u.id>10 orderby 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 {

         PrivateTeacher 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();

 

 

 

Hibernate-HQL查询