hibernate查询汇总

本文详细介绍了Hibernate的各种查询方式,包括主键查询、HQL查询、Criteria查询、原生SQL查询、命名查询以及JDBC操作。讨论了HQL的优势,如面向对象、独立于数据库,以及如何进行实体、投影、参数绑定、分页和聚合函数的查询。还涵盖了Criteria查询的使用,命名查询的HQL和SQL实现,以及JDBC操作的基本方法。此外,文章提到了更新操作和fromula属性的应用。
摘要由CSDN通过智能技术生成

一、查询操作

1.hibernate支持多种查询方式

2.分类
主键查询,HQL查询,Criteria查询,原生sql查询,命名查询,JDBC操作,导航查询(根据关联关系自动查询)

二、主键查询

1.get方法 session.get()
2.load方法 session.load()

三、HQL查询

1.简介
1.1 概念

Hibernate Query Language,Hibernate查询语言

是一种面向对象的查询语言,其中没有表和列的概念,只有类,对象和属性的概念

1.2 优点

  • 不需要编写复杂的sql语句,而是针对实体类和属性进行查询
  • 查询结果是直接返回list对象集合,不需要再次的封装
  • 独立于数据库,根据dialect自动生成对应数据库的sql语句

2.基本用法

2.1语法
类似于sql,对应关系

select/update/delete… 属性名
from 类名

2.2使用HQL需要四步

1.获取session
2.编写HQL语句
3.创建Query对象(Query接口是HQL的查询接口,提供了各种查询功能)
4.执行查询,获取结果

//查询所有用户
String hql = "from User";//from类名,也可写成类的全限定名称
//select u.id,u.username from User u;
Query query = session.creatQuery(hql);
//查询
List<User> users = query.list();
System.out.println(users);

3.实体查询

  • 实体查询1,查询所有用户
  • 实体查询2,带条件
String hql = "from User where id>3 and username like'%i%' order by id desc";
Query query = session.creatQuery(hql);
//查询
List<User> users = query.list();
System.out.println(users);
  • 实体查询3,查询单个实体
String hql = "from User u where u.id=3";
Query query = session.creatQuery(hql);
//如果确定查询结果只有一条,则调用query.uniqueResult()方法返回单个结果
User user = query.uniqueResult();//查询返回单个结果,如果返回多个值会抛出异常
System.out.println(user);

4.投影查询
只查询类的一个或多个属性,并不获取对象的全部属性,也称为属性查询,有如下三种形式:

  • 投影查询1,查询单个属性,将每条查询结果封装成Obiect对象
String hql = "select u.username from User u where id>3";
Query query = session.creatQuery(hql);
List<Object> list = query.list();
for(String string : list){
	String username = string;
	System.out.println(username);
}
  • 投影查询2,查询多个属性,将每条查询结果封装成Object数组
String hql = "select u.username,u.password from User u where id>3";
Query query = session.creatQuery(hql);
List<Object[]> list = query.list();
for(Object[] object : list){
	System.out.println(object);
}
  • 投影查询3,查询多个属性,将每条查询结果封装成Map集合
String hql = "select new Map(u.username,u.password) from User u where id>3";
Query query = session.creatQuery(hql);
List<Map<Integer,Object>> list = query.list();//list里边存放着一个个map集合,key从0开始,value为 new Map时传入的参数
Sysetm.out.println(list);
  • 投影查询4,将每条查询结果通过构造函数封装成对象,前提POJO中一定有对应的构造方法
String hql = "select new User(u.username,u.password) from User u where id>3";
Query query = session.creatQuery(hql);
List<User> list = query.list();//list里边存放着一个个User对象 
Sysetm.out.println(list);

5.参数绑定

5.1 ?参数占位符
使用?作为参数的占位符,可以先设定参数,然后通过setter方法来设定参数的值
参数下标从0开始

  • 使用?号进行参数绑定
String hql = "from User where id>? and username like?";
Query query = session.creatQuery(hql);
query.setInteger(0,id);
query.setString(1,username);
List<User> list = query.list();
Sysetm.out.println(list);

5.2 命名参数
使用name标识一个名为username的查询参数,然后根据此参数名设置参数值

String hql = "from User where id>:id and username like:username";
Query query = session.creatQuery(hql);
query.setInteger("id",id);
query.setString("username",username);
List<User> list = query.list();
Sysetm.out.println(list);

5.3Bean参数
将参数封装成一个bean,然后通过query对象的setProperties(Object bean)方法设置参数值

  • 通过javaBean进行封装参数,进行参数绑定,需要定义javaBean
String hql = "from User u  where u.username like :username and id between : minid and :maxid";
Query query = session.creatQuery(hql);
query.setPoroperties(bean);
List<User> list = query.list();
Sysetm.out.println(list);

6.分页和聚合函数

6.1分页
Query对象提供了简便的分页方法:

  • setFirstResult(int firstResult); 设置从第几条开始
  • setMaxResult(int maxResults); 设置读取最大记录数

Hibernate会根据底层数据库自定生成相应的分页语句

public static void page(int pageSize,int pageNo){
	String hql = "from User";
	Query query = session.creatQuery(hql);
	List<User> list = query.list();
	
	int count = list.size();//总记录数
	
	int pages = count % pageSize == 0 ? (count/pageSize):(count/pageSize+1);//总页数
	System.out.println(pages);
	
	//设置分页
	query.setFirstResult((pageNo-1 * pageSize));
	query.setMaxResult(pageSize);
	List<User> users = query.list();
	System.out.println(users);
}

6.2 聚合函数

常用的聚合函数:count() , max() , min() , sum() , avg()

String hql = "select avg(u.age) from User u";
Query query = session.creatQuery(hql);
double count = (double)query.uniqueResult();
Sysetm.out.println(count);

子查询

分组查询

四、Criteria查询

1.简介
Criteria查询是Hibernate提供的一种完全面向对象的查询,它用面向对象的方式将构造查询的过做了封装,又称为对象查询。

2.基本用法

Restrictions提供了许多静态方法,用来限定查询条件

2.1 查询所有(常用)

public static void test01(){
	Criteria criteria = session.creatCriteria(User.class);
	List<User> list = criteria.list();
	System.out.println(list);
}

2.2 限定查询

public static void test02(){
	Criteria criteria = session.creatCriteria(User.class);
	//调用add方法添加限定条件,默认要符合所有条件
	criteria.add(Restrictions.eq("username","tom"));
	criteria.add(Restrictions.between("id",1,5));

	//条件并列
	//criteria.add(Restrictions.or(Restrictions.eq("username","tom"),Restrictions.gt("id",3));

	List<User> list = criteria.list();
	System.out.println(list);
}

五、原生的sql查询

1.简介

  • hibernate对原生的sql查询也提供了支持,也称为本地sql查询
  • 通过Sql Query 来支持原生sql查询
  • addEntity() 将查询结果集中的关系数据映射为对象

2.基本用法

String sql = "select * from t_user where name='tom'";
//SQLQuery继承自Query接口
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.addEntity(User.class);//转化成User类型
List<User> list = sqlQuery.list();
for(User user : list){
	System.out.println(user);
}

六、命名查询

1.简介

命名查询是指在映射文件中定义字符串形式的查询语句,即将查询语句写在hbm文件中

命名查询 既可以是HQL查询语句,也可以是SQL查询语句

2.HQL语句的命名查询

在hbm.xml映射文件中使用query元素定义一个HQL查询语句,与class元素并列

这里以用户登录为例:

1).在hbm.xml中写如下代码:

<query name="login">
	<![CDATA[
		from User where username=:username and password=:password
	]]>
</query>

2).在java代码中使用如下方式调用:

public static void test01(String username,String password){
	//获取名称为login的查询语句
	Query query = session.getNamedQuery("login");
	query.setString("username",username);
	query.setString("password",password);
	User user = (User)query.uniqueResult();
	System.out.println(user);
}

3.SQL语句的命名查询

在hbm.xml映射文件中使用sql-query元素定义一个sql查询语句,与class元素并列

1).在hbm.xml中写如下代码:

<sql-query name="login2">
	<![CDATA[
		select * from t_user where name=:name and pwd=:pwd
	]]>
	<!-- 指定关系型数据对应的实体-->
	<return class="cn.com.User"></return>
</sql-query>

2).在java代码中使用如下方式调用:

public static void test01(String username,String password){
	//获取名称为login2的查询语句
	SQLQuery sqlQuery = session.getNamedQuery("login2");
	sqlQuery.setString("name",username);
	sqlQuery.setString("pwd",password);
	sqlQuery.addEntity(User.class);//指定关系型数据对应的实体
	User user = (User)query.uniqueResult();
	System.out.println(user);
}

七、JDBC操作

1.简介

在hibernate 4.x中可以使用session的doWork()方法进行JDBC操作,会将Connection暴露出来

2.基本用法

public static void test(){
	List<User> list = new ArrayList<User>()
	session.doWork(new work(){
		@Override
		public void execute(Connection conn) throws Exception{
			Result rs = conn.prepareStatement("select * from
			user").executeQuery();
			while(rs.next()){
				User user = new User(rs.getInt("id"),
				rs.getString("name"),rs.getString("pwd"),
				rs.getInt("age"));
				list.add(user);
			}
		}
	});
	System.out.println(list);
}

八、其他

1.更新操作

使用query的executeUpdate()方法进行更新操作,增,删,改操作

public static void test(){
	TransactionManager.beginTransaction();
	String hql = "delete from User where id in(2,3,5,7)
	and password='123'";
	Query query = session.createQuery(hql);
	int result = query.executeUpdate;//返回影响行数
	System.out.println(result);
	TransactionManager.commit();
}

2.fromula 属性

该属性可以用sql动态的生成实体属性,将sql的执行结果动态的映射到实体属性上

要求:

  • 实体要存在相应的属性
  • sql语句必须用小括号 () 包裹起来
  • 如果操作列名,必须为表起别名

1).在hbm.xml中配置

<!-- 该属性不对应数据库中的列,对应的是sql的查询结果-->
<property name="count" fromula="(select count(u.id) from t_user u)"></property>

2).测试fromula属性

User user = (User)session.get(User.class,1);
System.out.println(user)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值