Hibernate的查询方式具有面向对象的思想,在查询的时候,都是动过gei(id)的方式查询一条数据,然后Hibernate自动设置进去到POJO类对象,返回一个代理类给我们。
学生类:public class Student { private int sId;//学生的id private int tId;//教师的id private String sName;//学生的姓名 private String sSex;//学生的性别 //省略get,set方法,无参构造方法,有参构造方法 }
教师类:
public class Teacher { private int tId;//教师的id private String tName;//教师的姓名 //同样,省略get,set方法,无参构造方法,有参构造方法 }
这里有学生和教师两个类,同时映射数据库中学生表和教师表,如果我们想要拿到这两个表的数据,那么我们可以
hql=“select s.sId,s.sName,s.sSex,t.tId,t.tName from Student s,Teacher t where s.tId=t.tId ”,用Query类执行这句hql语句,调用query.list()得到一个list集合,注意这个list集合里存放的都是Object[]。
String hql="select s.sId,s.sName,s.sSex,t.tId,t.tName from Student s,Teacher t where s.tId=t.tId"; Query q=session.createQuery(hql); List<Object> list=q.list(); for (Object object : list) { Object[] objs=(Object[])object; System.out.println(Arrays.toString(objs)); } JSONArray jsonArr=JSONArray.fromObject(list); System.out.println(jsonArr.toString());
遍历list集合,我们就拿到了我们想要的数据了
[3, 夏侯惇, 男, 1, 魏老师] [1, 张飞, 男, 2, 蜀老师] [2, 关羽, 男, 2, 蜀老师] [6, 刘备, 男, 2, 蜀老师] [4, 周瑜, 男, 3, 吴老师] [5, 大乔, 女, 3, 吴老师]
但是这样的数据是无法直接转成json格式数据的。
[[{"sId":3,"sName":"夏侯惇","sSex":"男","tId":1},{"tId":1,"tName":"魏老师"}],[{"sId":1,"sName":"张飞","sSex":"男","tId":2},{"tId":2,"tName":"蜀老师"}],[{"sId":2,"sName":"关羽","sSex":"男","tId":2},{"tId":2,"tName":"蜀老师"}],[{"sId":6,"sName":"刘备","sSex":"男","tId":2},{"tId":2,"tName":"蜀老师"}],[{"sId":4,"sName":"周瑜","sSex":"男","tId":3},{"tId":3,"tName":"吴老师"}],[{"sId":5,"sName":"大乔","sSex":"女","tId":3},{"tId":3,"tName":"吴老师"}]]
不过hibernate还支持另一种方式,就是增加一个映射类
这个新的映射类的属性,应该包含素有你需要查找的字段以及get()和set()方法
更重要的是,需要新增一个构造函数,这个构造函数的参数为你需要查询出来的属性,并且在构造函数里面为其赋值。
public class TeaAndStu { private int tId;//教师的id private int sId;//学生的id private String tName;//教师的姓名 private String sName;//学生的姓名 private String sSex;//学生的性别 //省略get,set方法,省略构造方法 }
Session session=SessionUtil.getSession(); Transaction tran=session.beginTransaction(); String hql="select new com.test.entity.TeaAndStu(t.tId,s.sId,t.tName,s.sName,s.sSex) from Student s,Teacher t where s.tId=t.tId"; Query q=session.createQuery(hql); List<TeaAndStu> list=q.list(); for (TeaAndStu teaAndStu : list) { System.out.println(teaAndStu.toString()); } JSONArray jsonArr=JSONArray.fromObject(list); System.out.println(jsonArr);这样通过映射类得到的list集合数据就可以转成json格式数据了。
TeaAndStu [tId=1, sId=3, tName=魏老师, sName=夏侯惇, sSex=男] TeaAndStu [tId=2, sId=1, tName=蜀老师, sName=张飞, sSex=男] TeaAndStu [tId=2, sId=2, tName=蜀老师, sName=关羽, sSex=男] TeaAndStu [tId=2, sId=6, tName=蜀老师, sName=刘备, sSex=男] TeaAndStu [tId=3, sId=4, tName=吴老师, sName=周瑜, sSex=男] TeaAndStu [tId=3, sId=5, tName=吴老师, sName=大乔, sSex=女] [{"sId":3,"sName":"夏侯惇","sSex":"男","tId":1,"tName":"魏老师"},{"sId":1,"sName":"张飞","sSex":"男","tId":2,"tName":"蜀老师"},{"sId":2,"sName":"关羽","sSex":"男","tId":2,"tName":"蜀老师"},{"sId":6,"sName":"刘备","sSex":"男","tId":2,"tName":"蜀老师"},{"sId":4,"sName":"周瑜","sSex":"男","tId":3,"tName":"吴老师"},{"sId":5,"sName":"大乔","sSex":"女","tId":3,"tName":"吴老师"}]
ps:上面文章中有哪些错误还请指出,我会一一修正。