使用HQL语句进行数据查询
-熟练掌握HQL语句的查询
-掌握Criteria查询
为什么使用HQL语句?
因为session.get()或load方法只可以获取单个对象,不能获取结果集。
HQL Hibernate Query language 是官方推荐的标准查询语句,语句结构与标准的SQL相似,但使用面向对象的方式进行数据操作。
HQL语句是SQL与JavaBean的结合体,在HQL中使用数据表的映射类来进行编写。
使用HQL语句的步骤:(查询不可以创建事务)
(1)创建session对象
(2)编写HQL语句
(3)创建Query对象
(4)执行查询
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
(1)整表查询(from 类名的整表查询可以直接通过泛型获取该表映射的集合类)
Query query = session.createQuery("from User");
List<User> list = query.list();
for(User u : list){
System.out.println(u.getUserName());
}
(2)查询指定属性 返回Object[]
Query query = session.createQuery("select userId,userName,password,sex from User");
//进行查询
List<Object[]> list = query.list();
for(Object[] array : list){
System.out.println(array[0]+"\t"+array[1]+"\t"+array[2]+"\t"+array[3]);
}
(3)根据条件查询
Query query = session.createQuery("from User where userName='admin'");
User user = (User) query.list().get(0);
System.out.println(user.getPassword());
(4)使用占位符(HQL提供类似于PreparedStatement的参数注入方式进行数据查询
)
Query query = session.createQuery("from User where userName=?");
//注入参数,索引从0开始
query.setString(0, "tom");
User user = (User) query.list().get(0);
System.out.println(user.getPassword());
(5)复杂的SQL语句执行
Query query = session.createQuery("from Employee where dep.depId=(select depId from Department where depName=?) ");
query.setString(0, "IT");
List<Employee> list = (List<Employee>) query.list();
for(Employee emp : list){
System.out.println(emp.getFirstName()+"\t"+emp.getDep().getDepName());
}
(6)分页查询
//设置当前页数
int page = 2;
//设置每页的记录条数
int count = 5;
//设置每页的起始索引 第一页从0开始
int index = count*(page-1);
Query query = session.createQuery("from Employee");
query.setFirstResult(index);
query.setMaxResults(count);
List<Employee> list = (List<Employee>) query.list();
for(Employee emp : list){
System.out.println(emp.getEmpId()+"\t"+emp.getFirstName());
}
(7)查询单行单列数据
Query query = session.createQuery("select count(*) from Employee");
Long count = (Long) query.uniqueResult();
System.out.println(count);
(8)表连接查询(当为表起别名后,在访问属性时必须要前缀别名)
Query query = session.createQuery("select emp.firstName,dep.depName from Employee as emp,Department as dep where emp.dep.depId=dep.depId");
List<Object[]> list = query.list();
for(Object[] array : list){
System.out.println(array[0]+"\t"+array[1]);
}
criteria
Criteria是Hibernate标准的对象查询方式,操作的方式更类似于JAVA对象的操作。
(1)创建Criteria(2)
添加查询的规则(3)
执行查询
Criteria criteria = session.createCriteria(Employee.class);
criteria.add(Restrictions.eq("firstName", "Steven"));
List<Employee> list = criteria.list();
for(Employee emp : list){
System.out.println(emp.getEmpId()+"\t"+emp.getFirstName());
}