hql语句分三种情况考虑:
单表;
一对多 & 多对多;
多表结合
需求:查询所有班级信息
public class HQLDao extends HiberanteUtils{
/**
* 单表
*/
public List<Classes> queryAllClasses(){
Session session = sessionFactory.openSession();
List<Classes> cList = session.createQuery("from Classes").list(); //HQL 语句
session.close();
return cList;
}
// 工厂模式
public static HQLDao getInstance(){
return new HQLDao();
}
}
结果:cname的值列表 description的值列表
=======================================================
需求:带属性的查询
public List queryClasses_Properties(){
Session session = sessionFactory.openSession();
List cList = session.createQuery("select cid, cname from Classes").list(); // 带属性cid, cname的查询
session.close();
return cList;
}
上面两个查询的结论:带 select 的查询和不带select 的查询结果完全不同。
带select的:查出来的是“对象”;
不带 select 的:查出来的是“数组”。
========================================================
需求:希望在 List 中包含有 JavaBean 的形式的查询
在HQLDao.java 中
public List<Classes> queryClasses_Constructor(){
Session session = sessionFactory.openSession();
List<Classes> cList = session.createQuery("select new cn.google.hiberate.sh.domain.Classes(cname, description) from Classes").list();
session.close();
return cList;
}
必要条件: 在 Classes.java 中添加带参数的构造函数 public Classes(String cname, String description){
this.cname = cname;
this.description = description;
}
======================================================
需求:按条件查询班级,where id= ?
public Classes queryClasses_Condition(){
Session session = sessionFactory.openSession();
Query query = session.createQuery("select new cn.google.hiberate.sh.domain.Classes(cname,description) from Classes where cid=:cid");
query.setLong("cid", 1L);
Classes classes = (Classes)query.uniqueResult(); //返回唯一的结果集
System.out.println(classes.getCname());
session.close();
return classes;
}
==========================================
需求:查询 cid=1,2,3 的班级
public void queryClasses_SubSelect(){
Session session = sessionFactory.openSession();
List<Classes> cList = session.createQuery("from Classes where cid in(select cid from Classes where cid in(1,2,3))").list();
session.close();
}