Hibernate中的五种查询方式

本文回顾了Hibernate中的关系配置,如一对多、多对多,并详细介绍了五种查询方式:OID查询、对象导航查询、HQL查询、QBC查询和SQL查询。重点讨论了HQL和QBC,这两种面向对象的查询方法。
上篇内容的简单回顾

1、表与表之间关系

一对多关系:两张表,多的表加外键。
多对多关系:三张表,关系表加外键。
一对一关系:一张表。两张表,外键唯一,或者主键对应。


2、Hibernate中的一对多配置

搭建Hibernate基本环境,引入jar包
创建表

创建实体:
一的一方,放的是多的一方的集合
多的一方,放的是一的一方的对象

创建映射:
一的一方,配置set
多的一方,配置<many-to-one>

编写测试类

Hibernate的一对多的操作:
级联操作:cascade,用于操作其关联的对象。
级联保存或更新
级联删除
测试对象导航
一的一方放弃外键维护权:inverse为true


3、Hibernate的多对多配置

搭建Hibernate环境:
创建表
创建实体
放置的是对方的集合
创建映射
配置的是对象的<set>
编写测试类

Hibernate的多对多操作:
级联操作
级联保存或更新
级联删除(了解)

其他的操作:
给用户选择角色
给用户改选角色
给用户删除角色





Hibernate中的五种查询方式

1、OID查询

OID检索:Hibernate根据对象的OID(主键)进行检索。
使用get(), load()方法。

测试代码:

package com.pipi.hibernate04;

import myutils.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;

// OID方式查询:get(), load()
public class Test01 {
    public static void main(String[] args) {

        Session session = HibernateUtil.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        // OID方式查询:get()
        Emp emp1 = session.get(Emp.class, 7369);

        // OID方式查询:load()
        Emp emp2 = session.load(Emp.class, 7839);

        System.out.println(emp1);
        System.out.println(emp2);

        transaction.commit();
    }
}

2、对象导航查询

对象导航检索:Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。

测试代码:

package com.pipi.hibernate04;

import myutils.HibernateUtil;
import org.hibernate.Session;
import org.hibernate.Transaction;

import java.util.Set;

// 导航对象方式查询
public class Test02 {
    public static void main(String[] args) {

        Session session = HibernateUtil.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        // 给定员工的编号7839,能导航查询到他所在部门的信息
        Emp emp = session.get(Emp.class, 7839);
        Dept dept = emp.getDept();

        System.out.println(emp);
        System.out.println(dept);

        System.out.println("---------------------------------------------------------");

        // 给定部门编号10,能导航查询到该部门的所有员工信息
        Dept dept1 = session.get(Dept.class, 10);
        Set<Emp> emps = dept1.getEmps();

        System.out.println(dept1);
        for (Emp e : emps) {
            System.out.println(e);
        }

        transaction.commit();
    }
}

3、HQL查询(重点掌握)

HQL查询:Hibernate Query Language。
是一种面向对象的方式的查询语言。

HQL语法类似于sql语句。
通过session.createQuery(),用于接收一个HQL语句进行查询的方式。

注意:HQL语句中不能出现select * 选择。
HQL语句中出现的名字全是类中定义的名字,毕竟是面向对象查询。

下一篇详细介绍HQL查询。


4、QBC查询(重点掌握)

QBC查询:Query By Criteria,条件查询。是一种更加面向对象化的查询的方式。

完全看不到sql语句。
通过session.createCriteria()创建。

下一篇详细介绍QBC查询。


5、SQL查询

SQL查询:通过使用sql语句进行查询。

测试代码:

package com.pipi.hibernate05;

import com.pipi.hibernate04.Dept;
import com.pipi.hibernate04.Emp;
import myutils.HibernateUtil;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;

import java.util.Arrays;
import java.util.List;

// SQL查询方式
public class Test07_SQL {
    public static void main(String[] args) {

        Session session = HibernateUtil.getCurrentSession();
        Transaction transaction = session.beginTransaction();

        String sql = "select * from dept";
        SQLQuery sqlQuery = session.createSQLQuery(sql);
        List<Object[]> list = sqlQuery.list();

        for (Object[] objs : list) {
            System.out.println(Arrays.toString(objs));
        }

        System.out.println("--------------------------------------------");

        String sql2 = "select * from dept";
        SQLQuery sqlQuery2 = session.createSQLQuery(sql2);
        sqlQuery2.addEntity(Dept.class);  // 添加实体,封装到实体对象中
        List<Dept> list2 = sqlQuery2.list();

        for (Dept d : list2) {
            System.out.println(d);
        }

        transaction.commit();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值