一、查询操作
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)