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);
}
}

最新文章

  1. 菜单(Menu)的三中创建方式——Android开发之路2
  2. oracle--第一天PLSQL--bai
  3. Leetcode Valid Sudoku
  4. SPX Instant Screen Capture
  5. div中的内容水平垂直居中
  6. nginx url重定向
  7. iOS---TextView显示HTML文本
  8. RCE via XStream object deserialization &amp;&amp; SECURITY-247 / CVE-2016-0792 XML reconstruction Object Code Inject
  9. 20145330《Java程序设计》第四次实验报告
  10. Chrome使用技巧(几个月的心得)
  11. win7下制作ubuntu系统安装启动盘和U盘安装ubuntu全过程
  12. Url.Content
  13. dll
  14. 免费企业ERP系统OA+ERP
  15. CentOS7安装docker 启动不了解决篇
  16. SIMD---AVX系列
  17. HRBUST1522【单调队列+DP】
  18. Canvas中的非零环绕
  19. ORA-12805: parallel query server died unexpectedly ORA-04030 (sort subheap,sort key) 原因排查与解决方法
  20. turtle库实现汉诺塔

热门文章

  1. git pull 的时候 把本地的修改 覆盖远程端
  2. centos iptables 数据转发
  3. shell脚本编写mind
  4. jquery中的ajax方法(备忘)
  5. git使用——忽略文件
  6. 使用DateTimeFormatter替换线程不安全的SimpleDateFormat
  7. Eclipse安装scala插件
  8. linux网络编程之posix共享内存
  9. 02 Spring IOC
  10. Oracle之约束