hibernate的基础学习--多表关联数据查询

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

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

 1 public class TestOID_OGN {
 2
 3     /**
 4      * 什么时候时候什么时候发送
 5      */
 6     @Test
 7     public void findUser() {
 8         SessionFactory sf = H3Util.getSessionFactory();
 9         Session session = sf.openSession();
10         Transaction ts = session.beginTransaction();
11         //小李子
12         User user = (User) session.get(User.class, "ff80808157c82de80157c82deb3c0001");
13         System.out.println("=========");
14
15         System.out.println(user);
16         ts.commit();
17         session.close();
18     }
19 }

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数据查询方式

 1 public class TestQBC {
 2
 3     @Test
 4     public void findUser() {
 5         SessionFactory sf = H3Util.getSessionFactory();
 6         Session session = sf.openSession();
 7         Transaction ts = session.beginTransaction();
 8
 9         Criteria criteria = session.createCriteria(User.class);
10         criteria.add(Restrictions.eq("username", "小小"));
11
12         User user = (User) criteria.uniqueResult();
13         //session.clear();
14         System.out.println("=========");
15         System.out.println(user.getDept());
16
17         ts.commit();
18         session.close();
19     }
20
21     @Test
22     public void findUser1() {
23         SessionFactory sf = H3Util.getSessionFactory();
24         Session session = sf.openSession();
25         Transaction ts = session.beginTransaction();
26
27         Dept dept = new Dept();
28         dept.setDeptId("ff80808157c831050157c83106c40001");
29
30         Criteria criteria = session.createCriteria(User.class);
31         criteria.add(Restrictions.eq("dept", dept));
32
33         @SuppressWarnings("unchecked")
34         List<User> list = criteria.list();
35         System.out.println("=========分割线===========");
36         for (User user : list) {
37             System.out.println(user);
38         }
39
40         ts.commit();
41         session.close();
42     }
43
44     @Test
45     public void findUser2() {
46         SessionFactory sf = H3Util.getSessionFactory();
47         Session session = sf.openSession();
48         Transaction ts = session.beginTransaction();
49
50         Dept dept = (Dept) session.get(Dept.class, "ff80808157c831050157c83106c40001");
51
52         //from User dept.deptId = ‘4028408157c14c210157c14c25370000‘
53         Criteria criteria = session.createCriteria(User.class);
54         //使用OGN:OID
55         criteria.add(Restrictions.eq("dept.deptId", dept.getDeptId()));
56
57
58         System.out.println("==========分割线============");
59         @SuppressWarnings("unchecked")
60         List<User> list = criteria.list();
61         for (User user : list) {
62             System.out.println(user);
63         }
64
65         ts.commit();
66         session.close();
67     }
68
69
70     @Test
71     public void findUser3() {
72         SessionFactory sf = H3Util.getSessionFactory();
73         Session session = sf.openSession();
74         Transaction ts = session.beginTransaction();
75
76         Dept dept = (Dept) session.get(Dept.class, "ff80808157c831050157c83106c40001");
77
78         //from User dept.deptName = ‘项目部‘
79         Criteria criteria = session.createCriteria(User.class);
80         //QBC:ONG方式中如果使用的的OID可以查询,但是如果使用的是除OID之外的其它属性
81         //就会报异常,解决方案:createAlias("dept")
82         //为dept起别名
83         criteria.createAlias("dept", "dept");
84         criteria.add(Restrictions.eq("dept.deptName", dept.getDeptName()));
85
86         @SuppressWarnings("unchecked")
87         List<User> list = criteria.list();
88         System.out.println("==========分割线===========");
89         for (User user : list) {
90             System.out.println(user);
91         }
92
93         ts.commit();
94         session.close();
95     }
96 }

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

  1 /**
  2  * @author nunu
  3  * 测试内连接,外连接查询
  4  */
  5 public class TestHQL2 {
  6
  7
  8     /**
  9      * 内连接:
 10      *  有关联数据:
 11      *  数据总量:从表被关联的数据总量
 12      *    数据模型:主表数据(延迟从) + 从表数据(含主)
 13      *
 14      */
 15     @Test
 16     public void findUser() {
 17         SessionFactory sf = H3Util.getSessionFactory();
 18         Session session = sf.openSession();
 19         Transaction ts = session.beginTransaction();
 20
 21         //部门:主表
 22         //员工:从表
 23         //sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
 24         String hql = "from Dept d inner join d.users";
 25         Query query = session.createQuery(hql);
 26
 27         @SuppressWarnings("unchecked")
 28         List<Object[]> list = query.list();
 29         System.out.println(list.size());
 30
 31         System.out.println("==========分割线===========");
 32         for (int i = 0; i < list.size(); i++) {
 33             Object[] objs = list.get(i);
 34             //主表数据
 35             Dept dept = (Dept) objs[0];
 36             User user = (User) objs[1];
 37             System.out.println(user);
 38             System.out.println(dept);
 39             /*
 40             //主表关联数据
 41             Set<User> userSet = dept.getUsers();
 42             for (User user : userSet) {
 43                 //如果延迟加载:回发送新语句查询
 44                 System.out.println(user);
 45             }
 46             */
 47             System.out.println("==");
 48             /*
 49             //从表数据
 50             User user = (User) objs[1];
 51
 52             //从表关联数据
 53             Dept dept = user.getDept();
 54
 55             System.out.println(dept);
 56             */
 57         }
 58
 59         ts.commit();
 60         session.close();
 61     }
 62
 63
 64     /**
 65      *     迫切内连接(数据重复DISTINCT)
 66      *        数据总量:从表被关联的数据总量
 67      *        数据模型:主表数据 (含从)
 68     */
 69     @Test
 70     public void findUser1() {
 71         SessionFactory sf = H3Util.getSessionFactory();
 72         Session session = sf.openSession();
 73         Transaction ts = session.beginTransaction();
 74
 75         //部门:主表
 76         //员工:从表
 77         //sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
 78         String hql = "from Dept d inner join fetch d.users";
 79         Query query = session.createQuery(hql);
 80         @SuppressWarnings("unchecked")
 81         List<Dept> list = query.list();
 82         System.out.println(list.size());
 83         System.out.println("===============分隔符=================");
 84         session.clear();
 85         for (Dept dept : list) {
 86             Set<User> users = dept.getUsers();
 87             for (User user : users) {
 88                 System.out.println(user);
 89             }
 90             System.out.println("---------");
 91         }
 92
 93         ts.commit();
 94         session.close();
 95     }
 96
 97
 98     /**
 99      *     隐式内连接
100      *         数据总量:主表数据总量
101      *         数据模型:主表数据(延迟从)
102     */
103     @Test
104     public void findUser2() {
105         SessionFactory sf = H3Util.getSessionFactory();
106         Session session = sf.openSession();
107         Transaction ts = session.beginTransaction();
108
109         //部门:主表
110         //员工:从表
111         //sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
112         String hql = "from Dept";        //默认就会用户关联了
113         Query query = session.createQuery(hql);
114         @SuppressWarnings("unchecked")
115         List<Dept> list = query.list();
116         System.out.println(list.size());
117         //session.clear();
118         System.out.println("===============分隔符=================");
119         for (Dept dept : list) {
120             Set<User> users = dept.getUsers();
121             for (User user : users) {
122                 System.out.println(user);
123             }
124             System.out.println("-----------------");
125         }
126
127         ts.commit();
128         session.close();
129     }
130
131
132     /**
133         左外连接: 以左侧表为准
134             数据总量:从表被关联数据总量+主表未关联数据总量
135             数据模型:主表数据(延迟从) ,从表数据 (含主)
136             (主表不存在关联数据的从表数据为0)
137     */
138     @Test
139     public void findUser3() {
140         SessionFactory sf = H3Util.getSessionFactory();
141         Session session = sf.openSession();
142         Transaction ts = session.beginTransaction();
143
144         //部门:主表
145         //员工:从表
146         //sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
147         String hql = "from Dept d left outer join d.users";//默认就会用户关联了
148         Query query = session.createQuery(hql);
149
150         @SuppressWarnings("unchecked")
151         List<Object[]> list = query.list();
152         System.out.println(list.size());
153
154         System.out.println("============分隔符==============");
155         for (int i = 0; i < list.size(); i++) {
156             Object[] objs = list.get(i);
157             //主表数据
158             System.out.println("\t ==主表数据");
159             Dept dept = (Dept) objs[0];
160             System.out.println("\t "+dept);
161
162             System.out.println("\t ==主表关联数据");
163             //主表关联数据
164             Set<User> userSet = dept.getUsers();
165             for (User user : userSet) {
166                 //如果延迟加载:回发送新语句查询
167                 System.out.println("\t "+user);
168             }
169
170             System.out.println("\t ==从表数据");
171             //从表数据
172             User user = (User) objs[1];
173             System.out.println("\t "+user);
174
175             System.out.println("\t ==从表关联数据");
176             //从表关联数据
177             Dept dept1 = user.getDept();
178
179             System.out.println("\t "+dept1);
180             System.out.println("-------------");
181         }
182         ts.commit();
183         session.close();
184     }
185
186
187     /**
188      *    迫切左外连接(数据重复DISTINCT)
189             数据总量:从表被关联数据总量+主表未关联数据总量
190             数据模型:主表数据(含从)
191             (主表不存在关联数据的从表数据为0)
192     */
193     @Test
194     public void findUser4() {
195         SessionFactory sf = H3Util.getSessionFactory();
196         Session session = sf.openSession();
197         Transaction ts = session.beginTransaction();
198
199         //部门:主表
200         //员工:从表
201         //sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
202         String hql = "from Dept d left outer join fetch d.users";//默认就会用户关联了
203         Query query = session.createQuery(hql);
204
205         @SuppressWarnings("unchecked")
206         List<Dept> list =  query.list();
207         System.out.println("============分隔符==============");
208         for (Dept dept : list) {
209             System.out.println(dept);
210
211             Set<User> userSet = dept.getUsers();
212             for (User user : userSet) {
213                 System.out.println(user);
214             }
215             System.out.println("-----------");
216         }
217         ts.commit();
218         session.close();
219     }
220
221
222
223     /**
224      *    右外连接:
225             数据总量:从表数据总量
226             数据模型:主表数据(延迟从) ,从表数据(含主)
227             (从表不存在关联数据的主表数据为null)
228     */
229     @Test
230     public void findUser5() {
231         SessionFactory sf = H3Util.getSessionFactory();
232         Session session = sf.openSession();
233         Transaction ts = session.beginTransaction();
234
235         //部门:主表
236         //员工:从表
237         //sql:select d.*,u.* from t_dept d inner join t_user u on d.dept_id = u.dept_id;
238         String hql = "from Dept d right outer join  d.users";//默认就会用户关联了
239         Query query = session.createQuery(hql);
240
241         @SuppressWarnings("unchecked")
242         List<Object[]> list = query.list();
243         System.out.println(list.size());
244         System.out.println("=============分隔符=================");
245         for (int i = 0; i < list.size(); i++) {
246             Object[] objs = list.get(i);
247             //主表数据
248             //Dept dept = (Dept) objs[0];
249             //System.out.println(dept.getDeptName());
250
251
252             //主表关联数据
253             /*Set<User> userSet = dept.getUsers();
254             for (User user : userSet) {
255                 //如果延迟加载:回发送新语句查询
256                 System.out.println(user.getUserId());
257             }*/
258
259             //从表数据
260             User user = (User) objs[1];
261             System.out.println(user);
262
263             //从表关联数据
264 //            Dept dept = user.getDept();
265 //            System.out.println(dept.getDeptName());
266 //            System.out.println(user.getUsername());
267             System.out.println("-------------");
268         }
269         ts.commit();
270         session.close();
271         ts.commit();
272         session.close();
273     }
274
275
276 }
时间: 2024-12-25 00:35:51

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

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

多对多采用学生老师模型进行测试 学生配置文件: 1 <?xml version="1.0" encoding="utf-8" ?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd&quo

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

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>bootstrap基础学习[表单](二)</title> <link rel="stylesheet" href="css/bootstrap.min.css" /> </head> <body style="padd

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

本文目录 EF对单个实体的增查改删 增加单个实体 查询单个实体 修改单个实体 删除单个实体 EF里主从表关联数据的各种增删改查 增加(增加从表数据.增加主从表数据) 查询(根据主表找从表数据.根据从表找主表数据) 修改(修改从表的外键) 删除(删除主从表关系.删除主表数据.删除主从表数据.修改从表数据外键) 补充内容 SaveChanges方法提交多次操作 DbSet.Add方法返回当前实体 源码和系列文章导航 注:本章节多次演示了各种删除,要重复查看效果,需要解开注释初始化数据方法. 一.EF

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

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

Hibernate学习(5)数据查询

Hibernate Query Language(HQL) Criteria Query Native SQL 下面对其分别进行解释 Hibernate Query Language: HQL提供了是十分强大的功能,它是针对持久化对象,用取得对象,而不进行update,delete和insert等操作.而且HQL是面向对象的,具备继承,多态和关联等特性. from子句: from子句是最简单的HQL,例如from Student,也可以写成 select s from Student s.它简单

MySQL多表关联数据同时删除

MySQL多表关联时的多表删除: DELETE t1, t2FROM    t1LEFT JOIN t2 ON t1.id = t2.idWHERE    t1.id = 25 原文地址:https://www.cnblogs.com/leeego-123/p/10821106.html

数据库 -- 单表的数据查询

单表查询的语法及关键字执行的优先级 单表查询语法 select distinct 字段一,字段二,... from 表名 where 条件 group by field having 筛选 order by field limit 限制条数  关键字执行的优先级 1. 找到表: from 2. 拿着where指定的约束条件,去文件 / 表中取出一条条记录 3. 将取出的一条条记录进行分组group by , 如果没有group by ,则整体作为一组 4. 执行select  (distinct

数据库(学习整理)----4--Oracle数据查询(基础点1)

其他: 计算机中的内存是线性的,一维. length('')计算字符的个数,而不是字节的个数 Oracle中的日期类型和数值类型的数据可以做运算符(>,=,<,<>)比较 如果在启动Oracle数据库的时候出现了:ora-12514的错误编号的提示. 解决方案: 去Oracle安装目录下面找到:C:\oracle\product\10.2.0\db_1\NETWORK\ADMIN目录下面: 找到:listener.ora文件和tnsnames.ora文件 修改文件的访问权限,管理员

hibernate的基础学习--一对一关联

一对一关系以丈夫和妻子模型 配置文件 妻子配置文件: <?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">