Hibernate 5 三种检索的策略和方式

学习三种检索策略

目的:学习三种检索策略的使用情况及配置。

内容:立即检索策略,延迟检索策略,迫切左外连接检索策略。

延迟检索策略

使用延迟检索策略的场合:

(1)一对多或者多对多关联。(2)应用程序不需要立即访问或者根本不会访问的对象。

优点:

由应用程序决定需要加载哪些对象,可以避免执行多余的select,以及避免加载应用程序不需要访问的对象。因此能提高检索性能,并节省内存空间。

实验步骤:

(1)配置具有一对多的关联关系的表

新建一个Student

package domain;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "student_table")
public class Student {

    @Id
    @Column(name = "student_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String studentNo;

    private String name;

    @OneToMany(targetEntity = Course.class, mappedBy = "student", fetch = FetchType.LAZY)
    private Set<Course> courses = new HashSet<>();

    public void setCourses(Set<Course> courses) {
        this.courses = courses;
    }

    public Set<Course> getCourses() {
        return courses;
    }

    public void setId(Integer id) { this.id = id; }

    public void setStudentNo(String studentNo) {
        this.studentNo = studentNo;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public String getStudentNo() {
        return studentNo;
    }

    public String getName() {
        return name;
    }

    public Student(){}
}

新建一个Course 

package domain;

import javax.persistence.*;

@Entity
@Table(name = "course_table")
public class Course {

    @Id
    @Column(name = "course_no")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer courseNo;

    private String courseName;

    @ManyToOne(targetEntity = Student.class)
    @JoinColumn(name = "student_id", referencedColumnName = "student_id", nullable = true)
    private Student student;

    public void setStudent(Student student) {
        this.student = student;
    }

    public Student getStudent() {
        return student;
    }

    public Integer getCourseNo() {
        return courseNo;
    }

    public void setCourseNo(Integer courseNo) {
        this.courseNo = courseNo;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public String getCourseName() {
        return courseName;
    }

    public Course(){ }

    public Course(String courseName){
        this.courseName = courseName;
    }
}

在配置文件中配置lazy属性为true

 

为两个表写入一些数据: 

        Session session = HibernateUtil.currentSession();
        Transaction transaction = session.beginTransaction();  
        Student student = new Student();
        student.setName("lyq");
        student.setStudentNo("1901030086");
        session.save(student);

        Course course1 = new Course("java开发框架");
        course1.setStudent(student);
        session.persist(course1);

        Course course2 = new Course("项目实战");
        course2.setStudent(student);
        session.persist(course2);
        transaction.commit();
        HibernateUtil.closeSession();

运行测试

package domain;

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

import java.util.Iterator;

public class RetrievalTest {
    public static void main(String[] args) {
        RetrievalTest rt = new RetrievalTest();
        rt.lazy();
    }

    private void lazy() {
        Session session = HibernateUtil.currentSession();
        Transaction transaction = session.beginTransaction();

//        Student student = new Student();
//        student.setName("lyq");
//        student.setStudentNo("1901030086");
//        session.save(student);
//
//        Course course1 = new Course("java开发框架");
//        course1.setStudent(student);
//        session.persist(course1);
//
//        Course course2 = new Course("项目实战");
//        course2.setStudent(student);
//        session.persist(course2);

        Student student = (Student) session.load(Student.class, 1);
        System.out.println("student name: " + student.getName());

        transaction.commit();
        HibernateUtil.closeSession();
//        Iterator course = student.getCourses().iterator();
    }
}

private void lazy()方法里的

Iterator course = student.getCourses().iterator();

去掉注释,执行结果如下:

 

 

立即检索策略 

 在Student类中设置fetch属性为EAGER即为立即检索策略

 运行结果如下:

 

private void lazy()方法里的

Iterator course = student.getCourses().iterator();

去掉注释,执行结果如下:

 

左外连接检索策略

在Course类中进行左外连接的设置:

 

 

测试RetrievalTest类里添加explicitOuterJoin()方法:

public void explicitOuterJoin(){
        Session session = HibernateUtil.currentSession();
        Transaction transaction = session.beginTransaction();

        List result = (List) session.createQuery(
                "FROM Student AS s LEFT JOIN FETCH s.courses WHERE s.id = 1").getResultList();
        System.out.println("result's size" + result.size());

        transaction.commit();
        HibernateUtil.closeSession();
    }

 运行结果如下:

测试类里添加outerJoin()方法 

public void outerJoin(){
        Session session = HibernateUtil.currentSession();
        Transaction transaction = session.beginTransaction();

        Course course = (Course) session.load(Course.class, 1);
        System.out.println("course name: " + course.getCourseName());

        transaction.commit();
        HibernateUtil.closeSession();
    }

学习三种检索方式

目的:学习三种检索方式。

内容:  HQL检索方式,QBC检索方式,SQL检索方式。

RetrievalTest类中添加hql方法:

public void hql(){
        Session session = HibernateUtil.currentSession();
        Transaction transaction = session.beginTransaction();

        List result = (List) session.createQuery(
                "FROM Student AS s WHERE s.name = :studentName").setParameter("studentName", "lyq").getResultList();
        System.out.println("lsit's size" + result.size());

        transaction.commit();
        HibernateUtil.closeSession();
    }

运行结果为:

RetrievalTest类中添加qbc方法: 

public void qbc(){
        Session session = HibernateUtil.currentSession();
        Transaction transaction = session.beginTransaction();

        Criteria criteria = session.createCriteria(Student.class);
        Criterion criterion = Expression.like("name", "lyq");
        criteria.add(criterion);
        List result = criteria.list();
        System.out.println("lsit's size" + result.size());

        transaction.commit();
        HibernateUtil.closeSession();
    }

运行结果:

RetrievalTest类中添加sql方法: 

public void sql(){
        Session session = HibernateUtil.currentSession();
        Transaction transaction = session.beginTransaction();

        String sql = "SELECT s.id, s.name FROM Student s WHERE s.name like:studentName";
        List result = (List) session.createQuery(sql).setParameter("studentName", "lyq").getResultList();
        System.out.println("lsit's size" + result.size());

        transaction.commit();
        HibernateUtil.closeSession();
    }

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值