Hibernate 查询方式

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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值