Hibernate系列(四):Hibernate两种查询方式:HQL和Criteria

Hibernate主要是提供与数据库之间交互的一个框架,想要用面向对象的语言操作关系型数据库,有如下两种操作方式:

HQL语句:面向对象的查询语言,对象名区分大小写。而且不同于SQL的是这里查询的是对象,而不是表,并且支持多态。hql主要通过Query操作

Criteria类:是一种面向对象的查询,主要查询条件。

一、HQL语句:

比如我们要根据name属性查询一条记录(对象):

static void query(String name){
		Session s = null;
		try{
			s = HibernateUtil.getSession(); //打开session
			String hql = "from User as user where user.name=?";//编写hql语句
			Query query = s.createQuery(hql);//打开查询
			query.setString(0, name);//为HQL语句中的属性赋值,0代表第一个问号(?)属性

			List<User> list = query.list(); //查询到满足条件的一个list
			for(User user:list){
				System.out.println(user.getName()); //然后输出
			}
		}finally{
			if(s!=null){
				s.close();
			}
		}
	}

注意,这里得到的满足条件的是一个列表。

另外,如上的hql语句如果用索引来赋值的话可能会产生问题,所以我们可以修改上边的代码为:

String hql = "from User as user where user.name=:name";//编写hql语句
Query query = s.createQuery(hql);//打开查询
query.setString("name", name);//为HQL语句中的属性赋值,0代表第一个问号(?)属性

如果我们能够确定查询得到的结果只有一个的话。

我们可以把代码:

List <User> list = query.list();
for(User user:list){
	System.out.println(user.getName());
}

修改成一句:

User u = (User) query.uniqueResult();
System.out.println(u.getName());

二、Criteria类

我们设计一个cri(String name)函数:

static void cri(String name){
		Session s = null;
		try{
			s = HibernateUtil.getSession();
			Criteria ctr = s.createCriteria(User.class);
			ctr.add(Restrictions.eq("name", name)); //添加查找条件:与name相等
			ctr.add(Restrictions.lt("birthday", new Date()));//添加查找条件:小于里边日期

			List<User> list = ctr.list();

			for(User user:list){
				System.out.println(user.getName());
			}
		}finally{
			if(s!=null){
				s.close();
			}
		}
	}
时间: 2024-10-11 06:45:53

Hibernate系列(四):Hibernate两种查询方式:HQL和Criteria的相关文章

Hibernate的Api以及三种查询方式

Hibernate  Api |-- Configuration       配置管理类对象 config.configure();    加载主配置文件的方法(hibernate.cfg.xml) 默认加载src/hibernate.cfg.xml config.configure("cn/config/hibernate.cfg.xml");   加载指定路径下指定名称的主配置文件 config.buildSessionFactory();   创建session的工厂对象 |--

Hibernate(八)--session的两种获取方式

openSession getCurrentSession Hibernate有两种方式获得session,分别是: openSession和getCurrentSession他们的区别在于1. 获取的是否是同一个session对象 openSession每次都会得到一个新的Session对象 getCurrentSession在同一个线程中,每次都是获取相同的Session对象,但是在不同的线程中获取的是不同的Session对象 SessionFactory factory=new Confi

Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询

HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象.其它的,包括一些查询函数(count(),sum()等).查询条件的设定等,全都跟SQL语法一样. 示例: Session session = SessionFactory.getCurrentSession(); User user = null; Transaction ts = s

Spring与Hibernate两种组合方式

Spring与Hibernate大致有两种组合方式,主要区别是一种是在Hibernate中的hibernate.cfg.xml中配置数据源,一种是借助Spring的jdbc方式在Spring的applicationContext.xml文件中配置数据源,然后在Spring配置sessionFactory的bean有些区别 下面大致的说明一下 第一种 1.hibernate.cfg.xml文件 xml version='1.0' encoding='utf-8'?> "-//Hibernat

Hibernate的检索及五种数据检索方式

检索数据时的 2 个问题 1). 不浪费内存:当 Hibernate 从数据库中加载 Customer 对象时, 如果同时加载所有关联的 Order 对象, 而程序实际上仅仅需要访问 Customer 对象, 那么这些关联的 Order 对象就白 白浪费了许多内存. 2). 更高的查询效率:发送尽可能少的 SQL 语句 类级别的检索策略 2. 类级别的检索策略:(主要掌握 load 方法和 get 方法的区别!) 1). 类级别可选的检索策略包括立即检索和延迟检索, 默认为延迟检索 ①. 立即检

Hibernate查询方式---HQL方式

这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了类或者对象.其它的,包括一些查询函数(count(),sum()等).查询条件的设定等,全都跟SQL语法一样.###注意:     在hql中关键字不区分大小写,但是属性和类名区分大小写示例1: static void query(String name){ Session s=null; try{ s=Hiber

LINQ to Objects系列(2)两种查询语法介绍

LINQ为我们提供了两种查询语法,分别是查询表达式和查询方法语法.这篇文章分为以下几个方面进行总结. 1,一个包含两种查询语法的简单示例 2,查询表达式的结构 3,查询方法相关的运算符 一个包含两种查询语法的简单示例 一个LINQ查询既可以使用查询表达式实现,也可以用查询方法实现,还可以同时组合两种查询.下面是一个简单的示例,代码如下. namespace LINQDemo3 { class Program { static void Main(string[] args) { int[] nu

KbmMW两种查询结果集通讯方式

KbmMW本身可以用QueryService的方式进行远程数据查询,但是SmpileService同样具有很强的扩展性可以实现数据查询,下面展示两种基于SmpileService的远程数据查询方法,其原理都是利用TkbmMWSimpleService实现流的传输. 直接上代码了: 一.利用KbmMemTable: 服务端: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 3

我爱Java系列之---【SpringBoot中常用的注解和两种注入方式】

@EnableConfigurationProperties(DataSourceProperties.class) 来声明要使用DataSourceProperties 这个类并初始化该类对象,该类不用放在IOC容器中,可以通过该注解直接使用. [email protected]:一般写在类上边,通过该注解将当前类初始化到Spring的IOC容器中,其他类若想调用,直接用@Autowired去容器中拿. [email protected]: 一般写在类上边,标明该类是一个配置类,被注解的类内部