Hibernate的hql语句查询

本文介绍了Hibernate的HQL查询语言,包括查询全部、指定列名查询、函数查询、占位符查询以及分页查询。强调在查询总行数时需用long类型接收,并提供了占位符查询的两种方式。此外,还涉及到了子连接查询在一对多关系中的应用。
摘要由CSDN通过智能技术生成

HQL是Hibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL更接近SQL语句查询语法。

查询

查询全部(持久化数据)

//  s:是别名  一定要给对象取别名,不能用*。hibernate里面没有*
 String hql="select s from Student s";
 //查询出的是查询对象Query
  Query query=session.createQuery(hql);
//.list 查询出的一个list的集合
  List<Student> list=query.list();
  for (Student s : list) {
     System.out.println(s.getName());
  }

指定列名查询全部(非持久化数据)
有时候数据库的数据有可能有十几列,但是需要的只有几列,所有就需要指定列名查询

//查询指定列名的-----非持久态
//非持久化:因为查询出的数据与数据库不对应
//s.sid,s.name指定的列名      别名.列名
  String hql="select s.sid,s.name from Student s";
  Query query=session.createQuery(hql);
  //查询出来的是一个object数组,不是一个学生对象
  List<Object[]> list = query.list();
  for (Object[] objects : list) {
   System.out.println(objects[0]+"\t"+objects[1]);
  }

指定列名查询全部(持久化数据)

//查询指定列名的-----持久态
//在数据库有与之对应的,在student对象中
//new Student(s.sid,s.name)-------在实体类中要与之对应的构造函数
  String hql="select new Student(s.sid,name) from Student s";
  Query query=session.createQuery(hql);
  //查询出的就是Student对象
  List<Student> list=query.list();
  for (Student student : list) {
   System.out.println(student.getName());
  }

函数查询

//函数查询---最大值
//max(别名.列名)
  String hql="select max(s.sid) from Student s";
  Query query=session.createQuery(hql);
  //返回时是唯一的结果
  int max=(Integer) query.uniqueResult();
  System.out.println("最大值"+max);
注:在查询总行数的时候需要用long类型接收
占位符查询

第一种 通过取占位符名 :自定义名

//:name   自定义的名称 
String hql="select s from Student s where s.name like :name";
//设置占位符的值 setParameter(占位符名(不需要:,赋值));  没有顺序
  Query query=session.createQuery(hql).setParameter("name", "%xx%");
  List<Student> list = query.list();
  for (Student student : list) {
   System.out.println(student.getName());
  }

第二种:通过?占位符

//hibernate版本在5.版本以上的要在?后面加占位符的顺序
//比如   s.name like ?0  and s.age>?1
String hql="select s from Student s where s.name like ?0";
//赋值的时候就需要有顺序 从0开始
  Query query=session.createQuery(hql).setParameter(0, "%x%");
  List<Student> list = query.list();
  for (Student student : list) {
   System.out.println(student.getName());
  }

分页查询

//查询出全部
  String hql="select s from Student s ";
  int pages=1;//当前的页数
  int pageSize=5;//一页显示多少行
  //setMaxResults设置一页显示的最大数 setFirstReault设置从哪一页开始 
  Query query=session.createQuery(hql).setMaxResults(pageSize).setFirstResult((pages-1)*pageSize);
  List<Student> list = query.list();
  for (Student a : list) {
   System.out.println(a.getName());
  }

下面有连接查询(我使用的是一对多的关系)

//连接查询(全连接)
//c.province.pid  c里面的province对象里面的pid与p对象里面的pid
  String sql="select c from City c inner join Province p on c.province.pid=p.pid";
  Query query = session.createQuery(sql);
  List<City> list = query.list();
  for (City c : list) {
   System.out.println(c.getCname());
  }

子连接

 //查询城市带汉的所有省份名称
  String hql="select p from Province p where p.pid in(select c.province.pid from City c where c.cname like :cname)";
  Query query = session.createQuery(hql).setParameter("cname", "%汉%");
  List<Province> list=query.list();
  for (Province province : list) {
   System.out.println(province.getPname());
  }

子连接2

 //查询城市带湖的所有省份名称-----一个表的查询条件是另一个表的查询的结果
  String hql="select p from Province p where p.pid in(select c.province.pid from City c where c.cname like :cname)";
  Query query = session.createQuery(hql).setParameter("cname", "%汉%");
  List<Province> list=query.list();
  for (Province province : list) {
   System.out.println(province.getPname());
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值