hibernate 查询方式
OID查询
get 方法
- 当get方法被调用时就会立即发出SQL语句并且返回对象也是实际的对象
- 使用get和普通查询并无多大差别,当查询不当时候返回null
//get方法
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
User user1 = currentSession.get(User.class, 1L);
System.out.println(user1);
transaction.commit();
load方法
- 当调用load方法时会返回一个目标对象的代理对象,在这个代理对象中只存储了目标对象的id值
- 只有当调用除了ID值以外的属性值的时候才会发出sql
- 查询不到的时候load()会报错
//load方法
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
User user1 = currentSession.load(User.class, 1L);//如果不存在这个id的时候就会报出异常
System.out.println(user1.getUser_id());//查询id的时候不会发送sql语句
System.out.println(user1.getUser_name());//这个时候才会发送sql语句
transaction.commit();
对象导航查询
概念:根据已查到的对象将与之关联(外键)的对象查出来
HQL查询(Hibernate Query Language)
是一种面向对象方式的查询语句,语法类似sql
通过session.createQuery(),用于接收一个HQL进行查询
条件查询
- 位置绑定
Session session = HibernateUtil.openSeesion();
/*位置绑定的方式 已经不再使用*/
Query query = session.createQuery("from User ser where user_code=? and user_name=?");
query.setParameter(0,"user1");
query.setParameter(1,"张三");
List<User> list = query.list();
session.close();
- 别名绑定(:别名)
/*别名查询*/
Session session = HibernateUtil.openSeesion();
Query query = session.createQuery("from User ser where user_code=:aaa and user_name=:bbb ");
query.setParameter("aaa","张三");
query.setParameter("bbb","user1");
List<User> list = query.list();
System.out.println(list);
session.close();
投影查询
- 单个属性(单属性查询返回Object对象)
Session session = HibernateUtil.openSeesion();
List<Object> list1 = session.createQuery("select c.user_name from User c").list();
System.out.println(list1);
session.close();
- 多个属性(都属性查询时返回Object[])
//投影查询 查询多个属性
Session session = HibernateUtil.openSeesion();
List<Object[]> list2 = session.createQuery("select c.user_name,c.user_code from User c").list();
for (Object[] objects : list2) {
System.out.println(Arrays.toString(objects));
}
session.close();
- 查询多个属性,封装到对象当中(返回封装的对象)
1).在所有查询的对象所对应的实体类中创建投影查询属性的构造器和无参构造函数
//无参构造器
public User() {
}
//提供查询属性的构造器用于将查询的结果封装成对象
public User(String column1, String column2 {
this.column1= column1;
this.column2 = column2 ;
}
2).在查询的语句中将要查询的列用创建的对象的代替,并传入参数(查询列名)这样查询的结果就得到了一个对象集合。
//把查询的结果封装成对象
Session session = HibernateUtil.openSeesion();
Query query = session.createQuery("select new User(user_code,user_name) from User ");
List<User> list3 = query.list();
System.out.println(list3);
session.close();
分页查询
//分页查询
Session session = HibernateUtil.openSeesion();
Query query = session.createQuery("from User");
query.setFirstResult(0);//角标开始的位置
query.setMaxResults(1);//一次查多少条数据
List<User> list = query.list();
System.out.println(list);
session.close();
统计查询
- 查询所有记录数(一个结果即返回Object对象)
//统计查询 查询所有的记录数
Session session = HibernateUtil.openSeesion();
Query query = session.createQuery("select count(*) from User");
Object o = query.uniqueResult();//返回唯一结果
session.close();
- 分组查询 多个属性 (返回Object[]数组)
//统计查询 分组查询
Session session = HibernateUtil.openSeesion();
Query query = session.createQuery("select user_name,count(*) from User group by user_name");
List<Object[]> list = query.list();//返回结果不唯一时,调用的是list()
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
session.close();
多表查询(连接查询)
- 内连接(把两表外键相等的部分取出)
- 左连接(把左边表所有数据查出,并且查出右边表中外键相等的那部分)
- 右连接(与左连接相反)
普通内连接
- inner join 不需要再写外键相等的操作,配置文件中已经添加(返回为两个Object对象)
//多表查询 连接查询 普通查询
Session session = HibernateUtil.openSeesion();
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));
}
session.close();
迫切内连接
- 在普通内连接inner join 后添加一个关键字fetch 通过hibernate 将另外一个对象的数据封装到该对象当中,返回为封装的对象。
//多表查询 连接查询 迫切内连接
Session session = HibernateUtil.openSeesion();
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);
}
session.close();
QBC (Query By Criteria)条件查询(更加面向对象化)
简单查询、排序查询、分页查询
Session session = HibernateUtil.openSeesion();
//普通查询
Criteria criteria = session.createCriteria(User.class);
//添加排序
criteria.addOrder(Order.asc("user_id"));
//添加分页
criteria.setFirstResult(1);
criteria.setMaxResults(3);
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
//System.out.println(list);
session.close();
条件查询
- 符号:
‘=’ eq
‘>’ gt
‘<’ lt
‘>=’ ge
‘<=’ le
‘<>’ ne
like
in
and
or
Session session = HibernateUtil.openSeesion();
Criteria criteria = session.createCriteria(User.class);
//添加条件
criteria.add(Restrictions.eq("user_code","user1"));
//添加多条件
criteria.add(Restrictions.like("user_name","张%"));
//查询
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
session.close();
统计查询
Session session = HibernateUtil.openSeesion();
Criteria criteria = session.createCriteria(User.class);
//统计查询只有一个结果
//setProjection 用于设置一些集合函数
criteria.setProjection(Projections.rowCount());
//执行查询 只有一个结果 所以使用uniqueResult(唯一结果)
Object o = criteria.uniqueResult();
System.out.println(o);
离线条件查询
- 脱离session,添加条件
- 可以在外面提前使用DetachedCriteria对象提交设好条件,最后再绑定到session中。
//先设置条件
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);
detachedCriteria.add(Restrictions.like("user_name","张%"));
//添加条件到session中
Session session = HibernateUtil.openSeesion();
Criteria executableCriteria = detachedCriteria.getExecutableCriteria(session);
List<User> list = executableCriteria.list();
for (User user : list) {
System.out.println(user);
}
session.close();