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的更多相关文章

  1. Hibernate —— HQL、QBC检索方式

    一.HQL 检索方式 以双向的一对多来测试 HQL 检索方式.以 Department 和 Employee 为例. 建表语句: CREATE TABLE department ( dept_id ) ...

  2. Hibernate 检索查询的几种方式(HQL,QBC,本地SQL,集成Spring等)

    1.非集成Spring hibernate的检索方式,主要有以下五种. 1.导航对象图检索方式.(根据已经加载的对象,导航到其他对象.) 2.OID检索方式.(按照对象的OID来检索对象.) 3.HQ ...

  3. weblogic10异常:org.hibernate.hql.ast.HqlToken

    转自:http://www.programgo.com/article/68682994452/ 在做查询的时候,报出  org.hibernate.QueryException: ClassNotF ...

  4. SSH整合报错:org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped[......]

    非常诡异的报错,信息如下:org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped [select count(* ...

  5. Hibernate HQL查询:

    Hibernate HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查 ...

  6. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

  7. 解决Eclipse编译器报错ClassNotFoundException:Org.hibernate.hql.ast.HqlToken

    最近开发遇到Eclipse编译器老是报出ClassNotFoundException:Org.hibernate.hql.ast.HqlToken [from User Where id=1] 的错误 ...

  8. 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 ...

  9. Hibernate HQL详细说明

    1.  Hibernate HQL详细说明 1.1.  hql一个简短的引论 Hibernate它配备了一种非常强大的查询语言.这种语言看起来非常像SQL.但是不要 要对相位的语法结构似,HQL是很有 ...

随机推荐

  1. enumerateKeysAndObjectsUsingBlock 的用法

    block是一个有序列的指令代码块,通常在代码中间花括号括起来的objective-c代码,但是它能被传递和被分配局部变量,然后作为一个参数来传递,基本上可以把花括号中间的代码保存到数据结构里.看起来 ...

  2. python之迭代器、生成器及列表推导式

    一.迭代器 迭代器就是迭代的工具,迭代是一个重复的过程,每次重复都是一次迭代并且每次迭代的结果都是下次迭代的初始值. lst=[1,2,3,4,5] count=0 while count<le ...

  3. Ubuntu apt-get锁定问题

  4. linux网络编程之socket编程(六)

    经过一个国庆长假,又有一段时间没有写博文了,今天继续对linux网络编程进行学习,如今的北京又全面进入雾霾天气了,让我突然想到了一句名句:“真爱生活,珍惜生命”,好了,言归正传. 回顾一下我们之间实现 ...

  5. centos6.5上安装git

    亲测有效 https://blog.csdn.net/wxy540843763/article/details/80197301

  6. webuploader只选择单张图片

    webuploader只选择单张图片 一.总结 一句话总结: 在WebUploader.create中配置一下pick即可 pick: { id: '#filePicker', multiple:fa ...

  7. 【邻接矩阵+基础BFS】PAT-L3-008. 喊山

    L3-008. 喊山 一个山头呼喊的声音可以被临近的山头同时听到.题目假设每个山头最多有两个能听到它的临近山头.给定任意一个发出原始信号的山头,本题请你找出这个信号最远能传达到的地方.[何为最远?大致 ...

  8. windows程序意外关闭子订重启脚本

    window程序意外关闭自动重启脚本实现   @echo off :1 tasklist|find /i "xxxx"||start yyyy ping/n 11 127.1> ...

  9. U盘损坏?

  10. java中的volatile变量

    同步与线程间通信: 通信 通信是指消息在两条线程之间传递. 既然要传递消息,那接收线程 和 发送线程之间必须要有个先后关系,此时就需要用到同步.通信和同步是相辅相成的. 同步 同步是指,控制多条线程之 ...