前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hibernate查询方式

Hibernate查询方式

作者头像
木瓜煲鸡脚
修改2019-09-17 16:43:39
8270
修改2019-09-17 16:43:39
举报
文章被收录于专栏:Jasper小笔记

查询方式

1.OID

2.HQL

3.QBC

01

OID查询

什么是OID查询?

通过domain类中(映射文件设置的)OID属性进行查询

有两种方法?

一个是get,一个是load

get是立马生成sql语句到数据库去查询并封装成指定对象然后返回

load它不会去立刻查询而是生成一个代理对象由于没有去查询它只包含你给的OID,直到你用到其他属性才会去查询给你

02

HQL方式

什么是HQL?

HQL查询:Hibernate Query Language,Hibernate的查询语言

是一种面向对象的方式的查询语言,语法类似SQL。

通过session.createQuery(),用于接收一个HQL进行查询方式。

简单查询

代码语言:javascript
复制
//查询整个表:createQuery("from 类名 (别名)")
Query query = session.createQuery("from Course");
List<Course> courses = query.list();
for (Course c : courses) {
  System.out.println(c);
}

排序查询

代码语言:javascript
复制
//以整型属性排序:createQuery("from 类名 order by 属性 desc ")
Query query = session.createQuery("from Course order by course_id desc ");
List<Course> courses = query.list();
for (Course c : courses) {
  System.out.println(c);
}

条件查询

代码语言:javascript
复制
//createQuery("from 映射类 where course_id=:代名 and course_name=:代名 ")
//query.setParameter("代名",值);
Query query = session.createQuery("from Course where course_id=:a and course_name=:b ");
query.setParameter("a",1);
query.setParameter("b","语文");
List<Course> courses = query.list();
for (Course c : courses) {
  System.out.println(c);
}

投影查询

代码语言:javascript
复制
//createQuery("select 类名(别称).属性 from 类名 (别称)")
Query query = session.createQuery("select c.course_id from Course c");
List<Object> courses = query.list();
for (Object c : courses) {
  System.out.println(c);
}

分页查询

代码语言:javascript
复制
//createQuery("from Course")
//setFirstResult(行号)
//setMaxResult(条数)
//行号从零开始
Query query = session.createQuery("from Course");
query.setFirstResult(1);
query.setMaxResults(2);
List<Object> courses = query.list();
for (Object c : courses) {
  System.out.println(c);
}

统计查询

代码语言:javascript
复制
//count()
//单个结果uniqueResult()
Query query = session.createQuery("select count(*) from Course");
Object o = query.uniqueResult();
System.out.println(o);

分组查询

代码语言:javascript
复制
Query query = session.createQuery("select stu_age,count(*) from Student group by stu_age");
List<Object[]> list = query.list();
for(Object[] o : list){
  System.out.println(Arrays.toString(o));
}

多表查询-普通内连接

代码语言:javascript
复制
//createQuery("from 类名 别名 inner join 别名.关联属性")
//left join、right join
//查完得到集合每个元素两个对象
Query query = session.createQuery("from Student s inner join s.stu_class");
List<Object[]> list = query.list();
for(Object[] o : list){
  System.out.println(Arrays.toString(o));
}

多表查询-迫切内连接

代码语言:javascript
复制
//createQuery("from 类名 别名 inner join fetch 别名.关联属性")
//得到另外一个表对象封装在这个表的关联属性中,集合元素就是此类对象
Query query = session.createQuery("from Student s inner join fetch s.stu_class");
List<Object[]> list = query.list();
for(Object[] o : list){
  System.out.println(Arrays.toString(o));
}

03

QBC方式

什么是QBC?

Query By Criteria,条件查询。是一种更加面向对象化的查询的方式因此比起HQL更加的方便。

简单查询

代码语言:javascript
复制
//createCriteria(类名.class)
Criteria criteria = session.createCriteria(Course.class);
List<Course> list = criteria.list();
for(Course c : list){
  System.out.println(c);
}

分页查询

代码语言:javascript
复制
//criteria.setFirstResult(行号);
//criteria.setMaxResults(条数);
Criteria criteria = session.createCriteria(Course.class);
criteria.setFirstResult(0);
criteria.setMaxResults(2);
List<Course> list = criteria.list();
for(Course c : list){
  System.out.println(c);
}

排序查询

代码语言:javascript
复制
//criteria.addOrder(Order.desc("属性名"))
Criteria criteria = session.createCriteria(Course.class);
criteria.addOrder(Order.desc("course_id"));
List<Course> list = criteria.list();
for(Course c : list){
  System.out.println(c);
}

条件查询

符号

表达方法

=

eq

>

gt

>=

ge

<

lt

<=

le

<>

ne

like

like‍

in

in‍

or

or

and

and

代码语言:javascript
复制
//Restrictions.eq("属性名",值)
Criteria criteria = session.createCriteria(Course.class);
criteria.add(Restrictions.eq("course_id",1));
List<Course> list = criteria.list();
for(Course c : list){
  System.out.println(c);
}
代码语言:javascript
复制
Criteria criteria = session.createCriteria(Course.class);
criteria.add(Restrictions.or(Restrictions.eq("course_id",1),Restrictions.like("course_name","语%")));
List<Course> list = criteria.list();
for(Course c : list){
  System.out.println(c);
}

统计查询

代码语言:javascript
复制
//setProjection(Projections.rowCount())
Criteria criteria = session.createCriteria(Course.class);
criteria.setProjection(Projections.rowCount());
Object o = criteria.uniqueResult();
System.out.println(o);

离线条件查询

脱离Session,添加条件

可以在外部提前使用DetachedCriteria对象提交设置好条件

最后再绑定到session当中

代码语言:javascript
复制
public void lxTest(){
   Session session = HibernateUtil.openSession();
   DetachedCriteria dc = DetachedCriteria.forClass(Course.class);
   dc.add(Restrictions.like("course_name","语%"));
   //之前都是直接用session得到查询对象再操作
   //现在可以先写完最后添加到session进行会话
   Criteria c = dc.getExecutableCriteria(session);
   List<Course> list = c.list();
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT那个小笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档