hibernate总结多表查询

1.1笛卡尔积

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

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

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

多表查询



1.1 内连接

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

显示内连接

隐士内连接


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

1.4外链接

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

左外连接

右外连接


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

试图创建


1.5表的别名

使用表的别名有两种意义

(1)为了方便,简洁

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

使用别名的方式

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

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的多表查询

内连接

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

第一条是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迫切,加了这个关键字,最终的结果集封装的是一个对象,不加封装的是一个集合


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

double_lifly

点喜欢就是最好的打赏!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值