//查询指定列名的-----非持久态
//非持久化:因为查询出的数据与数据库不对应
//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());
}