Hibernate共提供4种多表关联数据查询方式
  OID数据查询+OGN数据查询方式
  HQL数据查询方式
  QBC数据查询方式
  本地SQL查询方式(hibernate很少用)

1、OID数据查询+OGN数据查询方式

 public class TestOID_OGN {

     /**
* 什么时候时候什么时候发送
*/
@Test
public void findUser() {
SessionFactory sf = H3Util.getSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction();
//小李子
User user = (User) session.get(User.class, "ff80808157c82de80157c82deb3c0001");
System.out.println("========="); System.out.println(user);
ts.commit();
session.close();
}
}

2、HQL数据查询方式

/**
* HQL 数据查询
*/
public class TestHQL { @Test
public void findUser() {
SessionFactory sf = H3Util.getSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction(); String hql = "from User";
Query query = session.createQuery(hql);
@SuppressWarnings("unchecked")
List<User> users = query.list();
for (User user : users) {
System.out.println("=="+user);
} ts.commit();
session.close();
} @Test
public void findUser1() {
SessionFactory sf = H3Util.getSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction(); //项目部中的所有 员工详细信息 String hql = "from Dept where deptname = '人事部'";
Query query = session.createQuery(hql);
Dept dept = (Dept) query.uniqueResult(); //OGN
Set<User> list = dept.getUsers();
for (User user : list) {
System.out.println(user);
} ts.commit();
session.close();
} @Test
public void findUser2() {
SessionFactory sf = H3Util.getSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction(); //项目部中的所有 员工详细信息
//PO
//Dept dept = (Dept) session.get(Dept.class,"ff80808157c831050157c83106c40001"); //DO
Dept dept = new Dept();
dept.setDeptId("ff80808157c831050157c83106c40001"); //以对象作为条件查询:根据对象id
//只要保证该对象具备:OID PO DO String hql = "from User where dept = ? ";
Query query = session.createQuery(hql);
query.setEntity(0, dept);
//什么类型都可以只使用
//query.setParameter(0, dept); @SuppressWarnings("unchecked")
List<User> list = (List<User>) query.list();
System.out.println("=================");
for (User user : list) {
System.out.println("=="+user);
} ts.commit();
session.close();
}
}

3、QBC数据查询方式

 public class TestQBC {

     @Test
public void findUser() {
SessionFactory sf = H3Util.getSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction(); Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.eq("username", "小小")); User user = (User) criteria.uniqueResult();
//session.clear();
System.out.println("=========");
System.out.println(user.getDept()); ts.commit();
session.close();
} @Test
public void findUser1() {
SessionFactory sf = H3Util.getSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction(); Dept dept = new Dept();
dept.setDeptId("ff80808157c831050157c83106c40001"); Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.eq("dept", dept)); @SuppressWarnings("unchecked")
List<User> list = criteria.list();
System.out.println("=========分割线===========");
for (User user : list) {
System.out.println(user);
} ts.commit();
session.close();
} @Test
public void findUser2() {
SessionFactory sf = H3Util.getSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction(); Dept dept = (Dept) session.get(Dept.class, "ff80808157c831050157c83106c40001"); //from User dept.deptId = '4028408157c14c210157c14c25370000'
Criteria criteria = session.createCriteria(User.class);
//使用OGN:OID
criteria.add(Restrictions.eq("dept.deptId", dept.getDeptId())); System.out.println("==========分割线============");
@SuppressWarnings("unchecked")
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
} ts.commit();
session.close();
} @Test
public void findUser3() {
SessionFactory sf = H3Util.getSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction(); Dept dept = (Dept) session.get(Dept.class, "ff80808157c831050157c83106c40001"); //from User dept.deptName = '项目部'
Criteria criteria = session.createCriteria(User.class);
//QBC:ONG方式中如果使用的的OID可以查询,但是如果使用的是除OID之外的其它属性
//就会报异常,解决方案:createAlias("dept")
//为dept起别名
criteria.createAlias("dept", "dept");
criteria.add(Restrictions.eq("dept.deptName", dept.getDeptName())); @SuppressWarnings("unchecked")
List<User> list = criteria.list();
System.out.println("==========分割线===========");
for (User user : list) {
System.out.println(user);
} ts.commit();
session.close();
}
}

4、HQL数据查询方式(测试内连接,外连接查询)

 /**
* @author nunu
* 测试内连接,外连接查询
*/
public class TestHQL2 { /**
* 内连接:
* 有关联数据:
* 数据总量:从表被关联的数据总量
* 数据模型:主表数据(延迟从) + 从表数据(含主)
*
*/
@Test
public void findUser() {
SessionFactory sf = H3Util.getSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction(); //部门:主表
//员工:从表
//sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
String hql = "from Dept d inner join d.users";
Query query = session.createQuery(hql); @SuppressWarnings("unchecked")
List<Object[]> list = query.list();
System.out.println(list.size()); System.out.println("==========分割线===========");
for (int i = 0; i < list.size(); i++) {
Object[] objs = list.get(i);
//主表数据
Dept dept = (Dept) objs[0];
User user = (User) objs[1];
System.out.println(user);
System.out.println(dept);
/*
//主表关联数据
Set<User> userSet = dept.getUsers();
for (User user : userSet) {
//如果延迟加载:回发送新语句查询
System.out.println(user);
}
*/
System.out.println("==");
/*
//从表数据
User user = (User) objs[1]; //从表关联数据
Dept dept = user.getDept(); System.out.println(dept);
*/
} ts.commit();
session.close();
} /**
* 迫切内连接(数据重复DISTINCT)
* 数据总量:从表被关联的数据总量
* 数据模型:主表数据 (含从)
*/
@Test
public void findUser1() {
SessionFactory sf = H3Util.getSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction(); //部门:主表
//员工:从表
//sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
String hql = "from Dept d inner join fetch d.users";
Query query = session.createQuery(hql);
@SuppressWarnings("unchecked")
List<Dept> list = query.list();
System.out.println(list.size());
System.out.println("===============分隔符=================");
session.clear();
for (Dept dept : list) {
Set<User> users = dept.getUsers();
for (User user : users) {
System.out.println(user);
}
System.out.println("---------");
} ts.commit();
session.close();
} /**
* 隐式内连接
* 数据总量:主表数据总量
* 数据模型:主表数据(延迟从)
*/
@Test
public void findUser2() {
SessionFactory sf = H3Util.getSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction(); //部门:主表
//员工:从表
//sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
String hql = "from Dept"; //默认就会用户关联了
Query query = session.createQuery(hql);
@SuppressWarnings("unchecked")
List<Dept> list = query.list();
System.out.println(list.size());
//session.clear();
System.out.println("===============分隔符=================");
for (Dept dept : list) {
Set<User> users = dept.getUsers();
for (User user : users) {
System.out.println(user);
}
System.out.println("-----------------");
} ts.commit();
session.close();
} /**
左外连接: 以左侧表为准
数据总量:从表被关联数据总量+主表未关联数据总量
数据模型:主表数据(延迟从) ,从表数据 (含主)
(主表不存在关联数据的从表数据为0)
*/
@Test
public void findUser3() {
SessionFactory sf = H3Util.getSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction(); //部门:主表
//员工:从表
//sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
String hql = "from Dept d left outer join d.users";//默认就会用户关联了
Query query = session.createQuery(hql); @SuppressWarnings("unchecked")
List<Object[]> list = query.list();
System.out.println(list.size()); System.out.println("============分隔符==============");
for (int i = 0; i < list.size(); i++) {
Object[] objs = list.get(i);
//主表数据
System.out.println("\t ==主表数据");
Dept dept = (Dept) objs[0];
System.out.println("\t "+dept); System.out.println("\t ==主表关联数据");
//主表关联数据
Set<User> userSet = dept.getUsers();
for (User user : userSet) {
//如果延迟加载:回发送新语句查询
System.out.println("\t "+user);
} System.out.println("\t ==从表数据");
//从表数据
User user = (User) objs[1];
System.out.println("\t "+user); System.out.println("\t ==从表关联数据");
//从表关联数据
Dept dept1 = user.getDept(); System.out.println("\t "+dept1);
System.out.println("-------------");
}
ts.commit();
session.close();
} /**
* 迫切左外连接(数据重复DISTINCT)
数据总量:从表被关联数据总量+主表未关联数据总量
数据模型:主表数据(含从)
(主表不存在关联数据的从表数据为0)
*/
@Test
public void findUser4() {
SessionFactory sf = H3Util.getSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction(); //部门:主表
//员工:从表
//sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
String hql = "from Dept d left outer join fetch d.users";//默认就会用户关联了
Query query = session.createQuery(hql); @SuppressWarnings("unchecked")
List<Dept> list = query.list();
System.out.println("============分隔符==============");
for (Dept dept : list) {
System.out.println(dept); Set<User> userSet = dept.getUsers();
for (User user : userSet) {
System.out.println(user);
}
System.out.println("-----------");
}
ts.commit();
session.close();
} /**
* 右外连接:
数据总量:从表数据总量
数据模型:主表数据(延迟从) ,从表数据(含主)
(从表不存在关联数据的主表数据为null)
*/
@Test
public void findUser5() {
SessionFactory sf = H3Util.getSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction(); //部门:主表
//员工:从表
//sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
String hql = "from Dept d right outer join d.users";//默认就会用户关联了
Query query = session.createQuery(hql); @SuppressWarnings("unchecked")
List<Object[]> list = query.list();
System.out.println(list.size());
System.out.println("=============分隔符=================");
for (int i = 0; i < list.size(); i++) {
Object[] objs = list.get(i);
//主表数据
//Dept dept = (Dept) objs[0];
//System.out.println(dept.getDeptName()); //主表关联数据
/*Set<User> userSet = dept.getUsers();
for (User user : userSet) {
//如果延迟加载:回发送新语句查询
System.out.println(user.getUserId());
}*/ //从表数据
User user = (User) objs[1];
System.out.println(user); //从表关联数据
// Dept dept = user.getDept();
// System.out.println(dept.getDeptName());
// System.out.println(user.getUsername());
System.out.println("-------------");
}
ts.commit();
session.close();
ts.commit();
session.close();
} }

hibernate的基础学习--多表关联数据查询的更多相关文章

  1. hibernate的基础学习--多对多关联

    多对多采用学生老师模型进行测试 学生配置文件: <?xml version="1.0" encoding="utf-8" ?> <!DOCTY ...

  2. hibernate的基础学习--一对多关联

    基本的用户和部门类,只有uuid和名称,没有其余字段. 配置文件 部门: <?xml version="1.0" encoding="utf-8" ?&g ...

  3. EF里单个实体的增查改删以及主从表关联数据的各种增删 改查

    本文目录 EF对单个实体的增查改删 增加单个实体 查询单个实体 修改单个实体 删除单个实体 EF里主从表关联数据的各种增删改查 增加(增加从表数据.增加主从表数据) 查询(根据主表找从表数据.根据从表 ...

  4. MagicalRecord 多表关联数据操作

    最近在使用MagicalRecord做数据持久层CoreData的操作库,今天做了一个多表关联数据的操作,整理了一个demo,特此记录一下. 关于如何使用Cocopads 和 MagicalRecor ...

  5. bootstrap基础学习【表单含按钮】(二)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. C# - VS2019 WinFrm应用程序连接Access数据库,并简单实现数据库表的数据查询、显示

    序言 众所周知,Oracle数据库和MySQL数据库一般在大型项目中使用,在某些小型项目中Access数据库使用较为方便,今天记录一下VS2019 WinFrm应用程序连接Access数据库,并实现数 ...

  7. MySQL多表关联数据同时删除

    MySQL多表关联时的多表删除: DELETE t1, t2FROM    t1LEFT JOIN t2 ON t1.id = t2.idWHERE    t1.id = 25

  8. oracle解决多表关联分组查询问题

    做了一个功能需要分组查询,同时查询A表分组查询的ID需要关联B表的数据,本来想两个表关联查询,但是报group by 语法不正确.所以做了以下修改. select count(*), cindexid ...

  9. MySQL数据库基础(4)SELECT 数据查询

    目录 一.SELECT 选择列表 二.MySQL 运算符 三.定制显示查询结果 四.模糊查询 一.SELECT 选择列表 1.语法 SELECT <COLUMN1, COLUMN2, COLUM ...

随机推荐

  1. add swapspace file on ubuntu.

    https://askubuntu.com/questions/566745/allocate-swap-after-ubuntu-14-04-lts-installation ----------- ...

  2. 转: 工欲善其事,必先利其器系列--Netbeans之远程开发

    转自: http://www.cnblogs.com/zuoca/archive/2012/07/09/Remote_Development_With_Netbeans_origin.html 工欲善 ...

  3. odoo写邮件添加收件人

    在任何可以写消息的地方点击鼠标     或者回复消息     写消息的框会聚焦并变大             点击撰写框右上角的弹出窗图标     弹出完整的撰写消息窗口     在红色的地方添加收件 ...

  4. Andrew Ng的机器学习视频文件夹(from coursera, 2014)

    第一周: 简单介绍机器学习,有监督学习.无监督学习. 1-1,1-2,1-3,1-4 第二周: 2-1:回归问题举例 2-2:介绍cost function定义. 2-3:在回归函数是一个经过原点的直 ...

  5. 12.怎样自学Struts2发送邮件和验证补充[视频]

    12.怎样自学Struts2发送邮件和验证补充[视频] 之前写了一篇"打算做一个视频教程探讨怎样自学计算机相关的技术",优酷上传不了,仅仅好传到百度云上: http://pan.b ...

  6. layer弹出层不居中解决方案,仅显示遮罩,没有弹窗

    问题:项目中layer询问层的弹窗仅显示遮罩层,并不显示弹窗…… 原因:图片太多将layer弹窗挤出屏幕下方,看不见了…… 解决方案:让layer的弹出层居中显示 一.问题描述 用layer做操作结果 ...

  7. Hdu3785

    <span style="color:#6600cc;">/* G - 寻找大富翁 Time Limit:1000MS Memory Limit:32768KB 64b ...

  8. jetty java文件无法删除 java文件占用 delete无效 运行时锁定静态资源的解决方法

    前几天jetty下发现java无法删除文件,文件操作后一直被jvm占用,无奈换了tomcat问题消失. 今天又想起来,尝试网上的解决方法,经本人试验,直接修改配置文件有时不能生效,具体原因不清楚,建议 ...

  9. 使用Android Studio查看API文档

    在使用Android Studio编码时,若要查看某个类或函数的释义, 只需将光标移动至要查看释义的代码处,然后按下Ctrl+Q,便会弹出文档描述. 然而,有时候会出现如下状况: 因为默认查看的是在线 ...

  10. Spark理论学习笔记(一)

    1.调度 分为FIFO和FAIR两种模式 创建调度池:sc.setLocalProperty("spark.scheduler.pool", "pool6") ...