Hibernate 查询:HQL查询(Hibernate Query Languge)

HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类,对象和属性的概念。

使用HQL查询所有学生:

main(String[] args) {Session session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();String hql = “from Student”;Query query = session.createQuery(hql);List<Student> students = query.list();System.out.println(students);session.getTransaction().commit();}

字符串 hql 是一条HQl语句,其中Student是指类名而不是表名,该语句查询Student类所映射的表的所有信息。 使用HQL查询时需要使用到org.hibernate.Query接口,使用Session.createQuery()方法来得到一个Query。使用Query.list方法向数据库查询数据,hibernate会自动把数据封装为相应的List集合。你也可以使用query.iterate()来得到一个Iterate。

查询单个对象(使用 uniqueResult()):

main(String[] args) {Session session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();String hql = “from Student where id = 1”;Query query = session.createQuery(hql);Student student = (Student)query.uniqueResult();System.out.println(student);session.getTransaction().commit();}

HQL 语句里可以有where字句,其中where id = 1 查找 id属性为1的学生,注意的是id是Student对象的属性,而不是表的列名! 确得查询结果只有一条记录事,可以使用Query.uniqueResult()方法。hibernate会自动把数据封闭为相应的对象。

查询指定的列:

main(String[] args) {Session session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();String hql = “select id,name from Student”;Query query = session.createQuery(hql);List<Object[]> s = query.list();session.getTransaction().commit();}

HQL可以只查询表的其中一列或多列。使用select字句,其中id和name是Student对象的属性名,而不是表的列名! 只查询指定列返回的是一个List<Object[]>对象。List里的一条记录对应数据库表的一行。Object[]的一个元素即对应表的一个单元格。如果使用 uniqueResult() 那返回的就是Object[]对象。

带命名参数的HQL:

main(String[] args) {Session session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();String hql = ” from Student where name like :name”;Query query = session.createQuery(hql);query.setString(“name”, “张%”);List<Student> s = query.list();session.getTransaction().commit();}

在HQL中,使用 : 加命名(如 :name)作为占位符,再使用Query.setString(),query.setInteger()等方法为相应的占位符设置参数(不确定类型可以使用setParameter())。 上面例子中的HQL语句等同于 “from Student where name like ‘张%'”

实例参数查询:

通过添加一个新类来作为HQL语句查询条件的参数。

public class BookQuery {private String name;private String author;private double maxPrice;private double minPrice;//省略get,set语句………}

查询任意名字,作者姓张,价格在5-20之间的图书:

main(String[] args) {//创建查询条件对象BookQuery bq= new BookQuery();bq.setName(“%”);bq.setAuthor(“张%”);bq.setMinPrice(5);bq.setMaxPrice(20);Session session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();String hql = “from Book where name like :name “+ “and author like :author “+ “and price between :minPrice and :maxPrice”;Query query = session.createQuery(hql);//把查询条件对象作为HQL查询的参数query.setProperties(bq);List<Book> books = query.list();session.getTransaction().commit();}

BookQuery类的属性名必须和HQL语句的参数名一致,并提供get,set方法。 通过 setProperties()方法把查询条件对象作为HQL查询的参数。

连接查询(join 语法):

main(String[] args) {Session session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();String hql = “from Student s inner join s.grade g”;Query query = session.createQuery(hql);List<Object[]> s = query.list();session.getTransaction().commit();}

内连接使用join,左外连接使用left join,右外连接使用reght join。和sql语句基本一致。 join 后面是 s.grade 而不是直接写 Grade 类名。因为表之间的关联关系已经通过映射文件或注解设好,所以在join子句中不需要声明关系。上面例子里同时返回学生和班级的所有信息,返回值是一个 List<Object[]><Object[]> 。其中每一个Object[]里,下标0的元素为Student对象,下标1的元素为Grade对象。

使用聚合函数:读书须用意,一字值千金。

Hibernate 查询:HQL查询(Hibernate Query Languge)

相关文章:

你感兴趣的文章:

标签云: