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:上面文章中有哪些错误还请指出,我会一一修正。