HQL对大小写比较敏感,查询均为对象中的属性,而不是数据库中的表。
简单属性查询
//简单属性查询返回对象数组,如果是单个属性则返回与实体对象匹配的类型,其中Emp为实体类
public void testQueryEmp(){
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction tran = session.beginTransaction();
//查询基本属性方式一
/*List emps= session.createQuery("select empNo,empName from Emp").list();
for(int i=0;i<emps.size();i++){
Object[] obj = (Object[]) emps.get(i);
System.out.println(Arrays.toString(obj));
}*/
//查询基本属性方式二
//如果需要返回对象则需要在实体对象中添加相应的构造方法
List<Emp> emps = session.createQuery("select new Emp(empNo,empName) from Emp").list();
for(Emp emp:emps){
System.out.println(emp.getEmpName());
}
session.close();
factory.close();
}
实体对象查询
public void testQueryEmp2(){
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction tran = session.beginTransaction();
//使用list发送一条sql语句
// List<Emp> emps = session.createQuery("from Emp").list();
//如果需要使用select查询时候定义别名时HQL不支持 select *
/*List<Emp> emps= session.createQuery("select e from Emp e").list();
for(Emp emp :emps){
System.out.println(emp.getEmpName()+" "+emp.getSalary());
}*/
//使用迭代器则会发送N条sql语句
Query query = session.createQuery("select e from Emp e");
Iterator<Emp> emps2 = query.iterate();
while(emps2.hasNext()){
Emp emp = emps2.next();
System.out.println(emp.getEmpName());
}
session.close();
factory.close();
}
注意:使用Iteration查询对象(普通属性除外)时发出N条语句进行查询,但如果缓存中存在数据默认情况下之下只会发送一条ID语句就不会发出其他查询语句。而list查询无论缓存是否存在数据,默认情况下多汁荟发出查询的语句。
条件查询
方式一
通过占位符方式:setParmeter
public void testQueryEmp3(){
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction tran = session.beginTransaction();
Query query = session.createQuery("from Emp where empName like ?");
query.setParameter(0, "%张%");
List<Emp> emps = query.list();
for(Emp emp:emps){
System.out.println(emp.getEmpName());
}
session.close();
factory.close();
方式二
通过重新命名来替代占位符
public void testQueryEmp3(){
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction tran = session.beginTransaction();
Query query = session.createQuery("from Emp where empName like :name");
List<Emp> emps = query.setParameter("name", "%张%").list();
for(Emp emp:emps){
System.out.println(emp.getEmpName());
}
session.close();
factory.close();
方式三
多参数的赋值
public void testQueryEmp3(){
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction tran = session.beginTransaction();
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
Query query = session.createQuery("from Emp where empNo in(:empNos)");
query.setParameterList("empNos", list); //可以为 数组 也可以为集合
List<Emp> emps= query.list();
for(Emp emp:emps){
System.out.println(emp.getEmpName());
}
session.close();
factory.close();
}
外之命名查询
外置命名查询即把查询语句写在配置文件中
配置文件中:Emp.hdm.xml
<query name="queryEmpByEmpNo">
select e from Emp e where empNo =?
</query>
Java代码:
public void testQueryEmp4(){
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction tran = session.beginTransaction();
Query query = session.getNamedQuery("queryEmpByEmpNo");
query.setParameter(0, 1);
List<Emp> emps = query.list();
for(Emp emp:emps){
System.out.println(emp.getEmpName());
}
session.close();
factory.close();
}
原生sql语句查询
Sql语句查询的字段要与数据库保持一致:createSQLQuery
public void testQueryEmp5(){
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction tran = session.beginTransaction();
Query query = session.createSQLQuery("select * from emp where emp_Name like ?");
query.setParameter(0, "%张%");
List emps = query.list();
for(int i=0; i<emps.size();i++){
Object[] obj = (Object[]) emps.get(i);
System.out.println(Arrays.toString(obj));
}
session.close();
factory.close();
}
分页查询
public void testQueryEmp6(){
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction tran = session.beginTransaction();
Query query = session.createQuery("from Emp");
query.setFirstResult(2);//起始位置
query.setMaxResults(2);//每页显示条数
// session.createQuery("from Emp").setFirstResult(2).setMaxResults(2).list;
List<Emp> emps = query.list();
for(Emp emp:emps){
System.out.println(emp.getEmpName());
}
session.close();
factory.close();
}
对象导航查询
public void testQueryEmp7(){
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction tran = session.beginTransaction();
Query query = session.createQuery("from Emp e where e.dept.deptNo=?");
query.setParameter(0, "1001");
List<Emp> emps = query.list();
for(Emp emp:emps){
System.out.println(emp.getEmpName());
}
session.close();
factory.close();
}
连接查询
public void testQueryEmp8(){
Configuration cfg = new Configuration().configure();
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
Transaction tran = session.beginTransaction();
Query query = session.createQuery("select e from Emp e left join e.dept d where e.empName like ?");
// Query query = session.createQuery("select e from Emp e");
// query.setParameter(0, "%张%"); s
List<Emp> emps = query.list();
for(Emp emp:emps){
System.out.println(emp.getEmpName()+" "+emp.getDept().getDeptName());
}
session.close();
factory.close();
}