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