HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类,对象和属性的概念。sql
public static void 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。数据库
public static void 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会自动把数据封闭为相应的对象。session
public static void 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[]对象。app
public static void 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语句查询条件的参数。spa
public class BookQuery { private String name; private String author; private double maxPrice; private double minPrice; //省略get,set语句......... }
查询任意名字,做者姓张,价格在5-20之间的图书:hibernate
public static void 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查询的参数。code
public static void 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对象。xml
public static void main(String[] args) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); String hql = "Select count(s) from Student s"; Query query = session.createQuery(hql); Object count = query.uniqueResult(); session.getTransaction().commit(); }
count()求总数、avg(...), sum(...), min(...), max(...)分别是平均值,总和,最大,最小值。对象
public static void main(String[] args) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); String hql = "from Student "; Query query = session.createQuery(hql); query.setFirstResult(2); query.setMaxResults(2); List<Student> s = query.list(); System.out.println(s); session.getTransaction().commit(); }
setFirstResult:设置开始行,从0开始。
setMaxResults:设置取的记录数。
经过把hql语句写到外部映射文件(*.hbm.xml)来实现HQL和代码分离。
在学生表的映射文件中加入以下代码:
<query name="getStudent"> <![CDATA[from Student where id=:id]]> </query>
<query>标签写在<hibernate-mapping>标签内。
<![CDATA[ ]]> 写的是一条HQL语句。
经过<query>标签的name属性为该HQL指定一个名称。
public static void main(String[] args) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Query query = session.getNamedQuery("getStudent"); query.setInteger("id", 6); Student s = (Student)query.uniqueResult(); session.getTransaction().commit(); }
经过session.getNamedQuery()方法获得一个用于命名查询的Query。把HQL语句的名称传进去。