• 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);
    	}
    }
    
  • 相关阅读:
    关于在组件GIS开发中使用Python的一点补充说明
    shell环境变量以及set,env,export的区别
    快速配置 Samba 将 Linux 目录映射为 Windows 驱动器
    Expect 教程中文版
    rpm 包管理
    .bash_profile和.bashrc的什么区别
    grep 零宽断言
    自动化测试
    dialog shell下的gui设计 代替繁杂libncurses编程
    x11 gtk qt gnome kde 之间的区别和联系
  • 原文地址:https://www.cnblogs.com/xzh0717/p/10813027.html
Copyright © 2020-2023  润新知