hibernate总结多表查询

1.1笛卡尔积

多表查询,书写方式,表名之间用,号隔开。这样将多张表的数据全部查出来,查出来的方式就是笛卡尔积的方式(完全组合)

这样查出来的数据,有很多是无效的数据

可以给多个表查询增加条件,查到想要的信息

多表查询

hibernate总结多表查询

hibernate总结多表查询

1.1 内连接

可以通过在设计数据库的时候,表与表之间的关联属性,过滤出有效的数据

显示内连接

hibernate总结多表查询

隐士内连接

hibernate总结多表查询

隐士内连接与显示内连接没有本质区别

1.4外链接

以一张表为基础。将这张表中的所有数据全部显示出来,然后跟另外一张表有关联,如果关联到则显示消息,如果没有关联则不显示为null

左外连接

hibernate总结多表查询

右外连接

hibernate总结多表查询

hibernate总结多表查询

总结:内连接就是共色部分。左外连接就是绿加红,右外链接就是黄加红

试图创建

hibernate总结多表查询

1.5表的别名

使用表的别名有两种意义

(1)为了方便,简洁

(2)如果是从重复的表进行多表查询,则必须使用表的别名

使用别名的方式

hibernate总结多表查询

(2)使用关键词as,与直接起名没有区别,但是看sql会语句比较容易

hibernate总结多表查询

1.6查询总结

(1)oid通过对象主键查询

public void fun(){
   //get 查找(只能通过主键)
    Configuration configuration = new Configuration().configure();
    SessionFactory sessionFactory = configuration.buildSessionFactory();
    Session session = sessionFactory.openSession();
    Transaction transaction = session.beginTransaction();

    Student student = session.get(Student.class, 1);
    System.out.println(student);
    transaction.commit();
    session.close();
    sessionFactory.close();
}

 

(2)Hql

public void fun1(){
    Session session = HibernateUtil.getSession();
    Transaction transaction = session.beginTransaction();
    //hql语句中的查找是类名类的属性名
    String hql = "from User where name=?";
    Query query = session.createQuery(hql);
    //hql 的占位符是从0开始的
    query.setParameter(0,"莫邪");
    List<User> list = query.list();
    System.out.println(list);
    transaction.commit();
    HibernateUtil.close(session);
}

 

(3)criteria适用于单表查询

public void fun(){
    Session session = HibernateUtil.getSession();
    Transaction transaction = session.beginTransaction();
    //获得criteria工厂 封装了方法  获得criteriaQuery对象
    CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
    //获得criteriaquery对象,封装所有信息,并告诉查询哪张表,存储查找条件
    CriteriaQuery<User> query = criteriaBuilder.createQuery(User.class);
    //指定从那张表进行查询 适用于单表,返回root对象 root存储的是数据库表的信息
    Root<User> root = query.from(User.class);
    //增加条件
    query.select(root);
    //讲条件放到query
    //把这个query对象传给session调用他的list方法
    List<User> list = session.createQuery(query).list();
    System.out.println(list);
    transaction.commit();
    HibernateUtil.close(session);
}

 

(4)sql(适用于非常复杂的查询)

Native原生态

public void fun(){
    Session session = HibernateUtil.getSession();
    Transaction transaction = session.beginTransaction();

    String sql = "SELECT *FROM student WHERE name=?";
    NativeQuery nativeQuery = session.createNativeQuery(sql,Student.class);
    nativeQuery.setParameter(1,"君莫邪");
    List<Student> list = nativeQuery.list();
    System.out.println(list);

    transaction.commit();
    HibernateUtil.close(session);
}

 

(5)对象导航查询

 

Hql的多表查询

内连接

hibernate总结多表查询

查出的结果封装了一条记录也是一个集合

第一条是Employee职工信息,也包含了企业信息

第二条是Enterprise企业信息

内容重复,迫切内连接只返回一个对象

String hql="from Employee e inner join fetch e.enterprise";

左外连接

String hql2="from Employee e left join fetch e.enterprise";

右外连接

String hql2="from Employee e righ tjoin fetch e.enterprise";

fetch迫切,加了这个关键字,最终的结果集封装的是一个对象,不加封装的是一个集合