OID查询
OID查询是根据对象的OID主键进行查询
OID的查询方式分为两种:get和load
get:(1)当get()方法被调用时,会立即发出SQL语句
(2)返回的对象是实际对象
(3)使用get()和普通的单条查询差别不大
(4)当查询不到时返回的是null
load:(1)当load()被调用时,返回的是目标对象的代理对象
(2)这个代理对象中只存储了目标对象的ID值
(3)当只有调用ID以外的属性时,才会发出SQL语句
(4)查询不到时,报错
对象导航查询
Hibernate根据一个已经查询的对象,获得其关联对象的一种查询方式
HQL查询
面向对象的查询语言,通过session.createQuery(),用于接受一个HQL进行查询方式
(1)简单查询
@Test
public void test1(){
//简单查询HQL
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User");
List<User> list = query.list();
for (User user : list) {
System.out.println(list);
}
}
(2)别名查询
public void test2(){
//别名询HQL
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select u from User u");
List<User> list = query.list();
for (User user : list) {
System.out.println(list);
}
}
(3)排序查询
public void test3(){
//排序查询
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User order by user_id desc");
List<User> list = query.list();
for (User user : list) {
System.out.println(list);
}
}
(4)条件查询
起别名的条件查询 需求:查询user_code为1 且user_name为李四的客户
public void test4(){
//起别名的条件查询查询
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User where user_code=:aaa and user_name=:bbb");
query.setParameter("aaa","1");
query.setParameter("bbb","李四");
List<User> list = query.list();
for (User user : list) {
System.out.println(list);
}
}
(5)投影查询
查询单个或部分字段
public void test5(){
//投影查询 查询单个属性
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select u.user_name from User u");
List<Object> list = query.list();
for (Object o : list) {
System.out.println(o);
}
//查询多个属性
List<Object[]> list1 = session.createQuery("select u.user_name,u.user_code from User u").list();
for (Object[] objects : list1) {
System.out.println( Arrays.toString(objects));;
}
//把查询的多个属性封装成对象 要在对应的类中创建查询相对应属性的构造器
List<User> list2 = session.createQuery("select new User(user_code,user_name)from User u").list();
for (User user : list2) {
System.out.println(user);
}
}
(6)分页查询
public void test6(){
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User");
//从第几条开始查 默认第一个角标是从0开始
query.setFirstResult(1);
//查多少条
query.setMaxResults(3);
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
(7)统计查询
查询所有的记录数
public void test7(){
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select count(*) from User");
Long o = (Long)query.uniqueResult();
System.out.println(o);
}
分组查询
public void test8(){
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select user_code, count(*) from User group by user_code");
List<Object[]> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
}
(8)多表查询
普通内连接
public void test9(){
//普通内连接查询
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User u inner join u.roles");
List<Object[]> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
}
查询出的list集合,里面装的是Object类型的数组
迫切内连接
public void test10(){
//迫切内连接查询
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User u inner join fetch u.roles");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
加上fetch 会把关联对象直接封装在查询对象里,返回的是装着查询类型的 list集合