Hibernate HQL和QBC
OID查询
一、什么是OID查询
根据对象的OID主键进行检索
二、OID查询方式
1. get方法
- 当get()方法被调用的时候就会立即发出SQL语句
- 并且返回的对象也是实际的对象
- 使用get()和普通的单条查询并没有多大的区别
- 当查询不到的时候get()返回的是null
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
User user = currentSession.get(User.class, 1L);
System.out.println(user);
transaction.commit();
2. load方法
- 当调用load()方法的时候会返回一个目标对象的代理对象
- 在这个代理对象中只存储了目标对象的ID值
- 只有当调用除ID值以外的属性值的时候才会发出SQL查询的
- 当使用到除ID以外的属性的时候,会发出SQL查询语句
- 当查询不到的时候load()报错 ObjectNotFoundException
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
User user = currentSession.load(User.class, 1L);
System.out.println(user.getUser_id());
System.out.println(user.getUser_name());
transaction.commit();
对象导航查询
Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。先查询到联系人,就可以通过联系人获取联系人所关联的客户对象。
HQL
一、什么是HQL
HQL查询:Hibernate Query Language,Hibernate的查询语言
- 是一种面向对象的方式的查询语言,语法类似SQL。
- 通过session.createQuery(),用于接收一个HQL进行查询方式。
二、查询
1. 简单查询
- 注意:HQL当中不支持 * 的写法。所以 select * from 类名 是错误的。
- createQuery("from 类名");
@Test
public void test(){
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
2. 别名查询
- 注意:HQL当中不支持 * 的写法。所以 select * from 类名 是错误的。
- createQuery("from 类名 别名");
@Test
public void test2(){
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select c from User c");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
3. 排序查询
- order by 字段 desc/asc
@Test
public void test3(){
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select c from User c order by user_id desc");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
4. 条件查询
(1)位置绑定
根据参数的位置进行绑定条件(不常用)
@Test
public void test4() {
Session session = HibernateUtil.openSession();
// Query query = session.createQuery("from User where user_code=? and user_name=?");
Query query = session.createQuery("from User where user_code=?0 and user_name=?1");
query.setParameter(0, "user1");
query.setParameter(1, "IT666");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
(2)名称绑定
把参数对应的值起一个名称 再去设置名称
@Test
public void test5() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User where user_code=:a and user_name=:b");
query.setParameter("a", "user1");
query.setParameter("b", "IT666");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
5. 投影查询
- 查询对象的某个或某些属性
(1)单个属性
@Test
public void test5() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select c.user_name from User c");
List<Object> list = query.list();
for (Object o : list) {
System.out.println(o);
}
}
(2)多个属性
@Test
public void test6() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select c.user_code,c.user_name from User c");
List<Object[]> list = query.list();
for (Object[] o : list) {
System.out.println(Arrays.toString(o));
}
}
(3)查询多个属性,封装到对象当中,要在类中,提供构造方法
// 提供有参构造器时,尽量也写上无参构造器
public User() {}
public User(String user_code, String user_name) {
this.user_code = user_code;
this.user_name = user_name;
}
@Test
public void test7() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select new User(user_code,user_name) from User c");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
6. 分页查询
@Test
public void test8() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User");
query.setFirstResult(0); // 角标开始位置
query.setMaxResults(2); // 一次查的条数
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
7. 统计查询
(1)查询的结构只有一个
@Test
public void test9() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select count(*) from User");
Object result = query.uniqueResult();
System.out.println(result);
}
(2)分组查询
@Test
public void test10() {
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[] o : list) {
System.out.println(Arrays.toString(o));
}
}
8. 多表查询
(1)普通内连接
@Test
public void test11() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User u inner join u.roles");
List<Object[]> list = query.list();
for (Object[] o : list) {
System.out.println(Arrays.toString(o));
}
}
(2)迫切内连接
在普通内连接inner join 后添加一个关键字fetch,通过hibernate将另一个对象的数据,封装该对象中
@Test
public void test12() {
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);
}
}
QBC
一、什么是QBC
Query By Criteria,条件查询。是一种更加面向对象化的查询的方式。
二、查询
1. 简单查询
@Test
public void test() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
2.排序查询
@Test
public void test2() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
// 添加排序
criteria.addOrder(Order.desc("user_id"));
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
3.分页查询
@Test
public void test3() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
// 添加排序
criteria.addOrder(Order.desc("user_id"));
// 分页
criteria.setFirstResult(0);
criteria.setMaxResults(2);
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
4.条件查询
条件
= eq
> gt
>= ge
< lt
<= le
<> ne
like
in
and
or
单个条件
@Test
public void test4() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
// 添加条件
criteria.add(Restrictions.eq("user_code", "user2"));
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
多个条件
@Test
public void test5() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
// 多条件
criteria.add(Restrictions.eq("user_code", "user2"));
criteria.add(Restrictions.like("user_name", "%888"));
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
统计查询

@Test
public void test6() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
// 统计查询 只有一个结果
criteria.setProjection(Projections.rowCount());
Object result = criteria.uniqueResult();
System.out.println(result);
}
离线条件查询
- 脱离Session,添加条件
- 可以在外部提前使用DetachedCriteria对象提交设置好条件
- 最后再绑定到session当中
@Test
public void test7() {
DetachedCriteria Criteria = DetachedCriteria.forClass(User.class);
Criteria.add(Restrictions.like("user_name", "%888"));
Session session = HibernateUtil.openSession();
Criteria executableCriteria = Criteria.getExecutableCriteria(session);
List<User> list = executableCriteria.list();
for (User user : list) {
System.out.println(user);
}
}
Hibernate HQL和QBC的更多相关文章
- Hibernate —— HQL、QBC检索方式
一.HQL 检索方式 以双向的一对多来测试 HQL 检索方式.以 Department 和 Employee 为例. 建表语句: CREATE TABLE department ( dept_id ) ...
- Hibernate 检索查询的几种方式(HQL,QBC,本地SQL,集成Spring等)
1.非集成Spring hibernate的检索方式,主要有以下五种. 1.导航对象图检索方式.(根据已经加载的对象,导航到其他对象.) 2.OID检索方式.(按照对象的OID来检索对象.) 3.HQ ...
- weblogic10异常:org.hibernate.hql.ast.HqlToken
转自:http://www.programgo.com/article/68682994452/ 在做查询的时候,报出 org.hibernate.QueryException: ClassNotF ...
- SSH整合报错:org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped[......]
非常诡异的报错,信息如下:org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped [select count(* ...
- Hibernate HQL查询:
Hibernate HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查 ...
- Hibernate学习笔记-Hibernate HQL查询
Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...
- 解决Eclipse编译器报错ClassNotFoundException:Org.hibernate.hql.ast.HqlToken
最近开发遇到Eclipse编译器老是报出ClassNotFoundException:Org.hibernate.hql.ast.HqlToken [from User Where id=1] 的错误 ...
- java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.MethodNode(尼玛,蛋疼的错误)
java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.MethodNode \-[M ...
- Hibernate HQL详细说明
1. Hibernate HQL详细说明 1.1. hql一个简短的引论 Hibernate它配备了一种非常强大的查询语言.这种语言看起来非常像SQL.但是不要 要对相位的语法结构似,HQL是很有 ...
随机推荐
- table固定宽度与自动宽度
table-layout:auto(创建的table默认是此布局模式): 对table和td.th指定的宽度无效,浏览器会计算所有单元格的内容宽度才能得出一列宽度 如果想对单元格的内容自动折行需使用w ...
- java的输入流中的两个坑
1.输入流的所有实例中的read()方法皆是阻塞的. 输入流只会在发生错误或者异常关闭的时候回返回-1,如果流中没有数据,不会返回-1而是一直阻塞. 2.BufferedReader的readLine ...
- 一语道破Java 11的ZGC为何如此高效
GC是大部分现代语言内置的特性,Java 11 新加入的ZGC号称可以达到10ms 以下的 GC 停顿,本文作者对这一新功能进行了深入解析.同时还对还对这一新功能带来的其他可能性做了展望.ZGC是否可 ...
- Linux 命令之 ln
ln 的作用是制作一个文件或者目录的快捷方式,让我们在使用的过程当中更加方便地使用. 下面我来简单介绍一下 ln 的基本用法. ln 的基本语法 生成一个软链 ln -s source_name li ...
- LVS实现健康性检查功能
LVS高可用性 Director不可用,整个系统将不可用:SPoF Single Point of Failure 解决方案:高可用 keepalived heartbeat/corosync 某RS ...
- 利用shell命令分析服务器日志
在没有专业日志分析系统的情况下,我们有时需要对日志进行简单的分析,下面列出一些常用的shell命令分析日志的方法,一定要收藏 1.查看有多少个ip访问 awk '{print $1}' log_f ...
- rabbitmq数据备份与还原
一.场景 现在有服务器A和服务器B ,由于业务需要,要求把服务器A上mq的数据迁移到服务器B上,rabbitmq的数据包括元数据(RabbitMQ用户.vhost.队列.交换和绑定)和消息数据,而消息 ...
- jFinal手册
JFinal官方文档 https://www.jfinal.com/ w3cschool之JFinal手册 https://www.w3cschool.cn/jfinal/
- RTC — 软件协作开发管理平台
IBM Rational Team Concert (简称RTC )是构建在IBM Rational面向软件交付技术的下一代协作平台Jazz平台上的一个商用产品.一个协作式的软件开发环境,它包含了集成 ...
- 大数据之路week06--day07(Linux中的mysql的离线安装)
这里我提供 服务端和客户端的两个jar包的百度云,也是我使用的 链接:https://pan.baidu.com/s/11a3LT-ENZ8n9IF19-VjmWA 提取码:bdls 离线安装Mysq ...