Hibernate(3)-使用HQL语句进行数据查询

来源:互联网 发布:java多线程网络爬虫 编辑:程序博客网 时间:2024/04/28 05:51

使用HQL语句进行数据查询

-熟练掌握HQL语句的查询
-掌握Criteria查询


为什么使用HQL语句?
因为session.get()或load方法只可以获取单个对象,不能获取结果集。

HQL Hibernate Query language 是官方推荐的标准查询语句,语句结构与标准的SQL相似,但使用面向对象的方式进行数据操作。

HQL语句是SQL与JavaBean的结合体,在HQL中使用数据表的映射类来进行编写。
使用HQL语句的步骤:(查询不可以创建事务)
        (1)创建session对象
        (2)编写HQL语句
        (3)创建Query对象
        (4)执行查询
  1. Configuration config = new Configuration().configure();
  2. SessionFactory factory = config.buildSessionFactory();
  3. Session session = factory.openSession();

(1)整表查询(from 类名的整表查询可以直接通过泛型获取该表映射的集合类)
  1. Query query = session.createQuery("from User");
  2. List<User> list = query.list();
  3. for(User u : list){
  4. System.out.println(u.getUserName());
  5. }
(2)查询指定属性 返回Object[]
  1. Query query = session.createQuery("select userId,userName,password,sex from User");
  2. //进行查询
  3. List<Object[]> list = query.list();
  4. for(Object[] array : list){
  5. System.out.println(array[0]+"\t"+array[1]+"\t"+array[2]+"\t"+array[3]);
  6. }

(3)根据条件查询
  1. Query query = session.createQuery("from User where userName='admin'");
  2. User user = (User) query.list().get(0);
  3. System.out.println(user.getPassword());

(4)使用占位符(HQL提供类似于PreparedStatement的参数注入方式进行数据查询
  1. Query query = session.createQuery("from User where userName=?");
  2. //注入参数,索引从0开始
  3. query.setString(0, "tom");
  4. User user = (User) query.list().get(0);
  5. System.out.println(user.getPassword());
(5)复杂的SQL语句执行
  1. Query query = session.createQuery("from Employee where dep.depId=(select depId from Department where depName=?) ");
  2. query.setString(0, "IT");
  3. List<Employee> list = (List<Employee>) query.list();
  4. for(Employee emp : list){
  5. System.out.println(emp.getFirstName()+"\t"+emp.getDep().getDepName());
  6. }

(6)分页查询
  1. //设置当前页数
  2. int page = 2;
  3. //设置每页的记录条数
  4. int count = 5;
  5. //设置每页的起始索引 第一页从0开始
  6. int index = count*(page-1);
  7. Query query = session.createQuery("from Employee");
  8. query.setFirstResult(index);
  9. query.setMaxResults(count);
  10. List<Employee> list = (List<Employee>) query.list();
  11. for(Employee emp : list){
  12. System.out.println(emp.getEmpId()+"\t"+emp.getFirstName());
  13. }


(7)查询单行单列数据
  1. Query query = session.createQuery("select count(*) from Employee");
  2. Long count = (Long) query.uniqueResult();
  3. System.out.println(count);

(8)表连接查询(当为表起别名后,在访问属性时必须要前缀别名)
  1. Query query = session.createQuery("select emp.firstName,dep.depName from Employee as emp,Department as dep where emp.dep.depId=dep.depId");
  2. List<Object[]> list = query.list();
  3. for(Object[] array : list){
  4. System.out.println(array[0]+"\t"+array[1]);
  5. }


criteria
Criteria是Hibernate标准的对象查询方式,操作的方式更类似于JAVA对象的操作。
(1)创建Criteria(2)添加查询的规则(3)执行查询
  1. Criteria criteria = session.createCriteria(Employee.class);
  2. criteria.add(Restrictions.eq("firstName", "Steven"));
  3. List<Employee> list = criteria.list();
  4. for(Employee emp : list){
  5. System.out.println(emp.getEmpId()+"\t"+emp.getFirstName());
  6. }












0 0