学习目标:
1、什么是hql
2、如何使用hql
学习过程:
一、什么是hql
hql是hibernate的查询语言,和sql语言非常类似,不过操作的对象而不是表,最终hql会根据当前hibernate的方言转换成为对应的sql语言,也就是说hql是hibernate对sql语言的抽象,它本身是不能直接操作数据库的。
二、使用hibernate应用hql
如果直接使用hibernate那么我们可以先得到Session,然后通过Session建立Query对象,最后通过Query就可以查询数据库了,Query类有点像原始的jdbc的Statement类。使用Hibernate查询示例如下:
public class Run1 {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
// 开启一个事务
session.beginTransaction();
//from Pojo类
String hql="from Post";
Query query=session.createQuery(hql);
List<Post> posts=query.list();
for(Post post:posts){
System.out.println(post.getPostName());
}
// 提交事物
session.getTransaction().commit();
session.close();
HibernateUtil.getSessionFactory().close();
}
}
三、投影查询(属性查询)
大家可以看到hibernate对查询支持非常好,直接返回的就已经是pojo对象,但是有的时候我们只是想查询对象的几个属性,而不是查询全部,在学习sql时,我们知道这称为投影查询,而在hibernate称为属性查询,属性查询返回的每一个列表都是一个数组。示例代码如下:
//投影查询
public class Run2 {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
// 开启一个事务
session.beginTransaction();
Query query=session.createQuery("select p.postName,p.postId from Post p");
List resuts=query.list();
for(int i=0;i<resuts.size();i++){
Object [] objects=(Object [])resuts.get(i);
System.out.println(objects[0]+":"+objects[1]);
}
// 提交事物
session.getTransaction().commit();
session.close();
HibernateUtil.getSessionFactory().close();
}
}