hibernate的三种查询方式
HQL是Hibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL接近SQL`语句查询语法。
完整的HQL语句形式如下:
select | update | delete … from … where … group by … having … order by … asc|desc
其中的update、delete为Hibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。HQL查询在整个Hibernate实体操作体系中占核心地位。
String hql = "HQL语句";
Query query = session.createQuery(hql);
List list = query.list(); //查询得到多个实体对象集合
Object result = query.uniqueResult(); //查询得到一个实体对象
int x = query.executeUpdate(); //执行update或delete语句,返回数据表受影响行数
1.2、实体查询
查询过程中表名使用类名,列名使用属性名,类名和属性名称区分大小写
String hql="from Users";//from 实体类类型名称
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
1.3、带where的查询
Query query = session.createQuery("from Users where uid=3");
Users user = (Users) query.uniqueResult();//uniqueResult 单一对象
System.out.println(user);
Query query = session.createQuery("from Users where uid>5");
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
1.3、属性查询
查询部分属性
String hql="select u.uid,u.uname,u.upwd from Users u where u.uname='张三'";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
String hql="select new Users(u.uname,u.upwd) from Users u where u.uname='张三'";
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
1.4、实体的更新和删除
从hibernate 3版本开始才支持
//更新
String hql="update Users set uname='王五',upwd='321' where uid=3";
int res = session.createQuery(hql).executeUpdate();
//删除
String hql="delete from Users where uid=3";
int res = session.createQuery(hql).executeUpdate();
/*
返回值结果:
正整数:表受影响的行数据
0: 语句正常执行,但没有行受影响
负整数:通常是-1,执行HQL语句是一条查询语句
*/
HQL语句不能做添加
1.5、分组与排序
排序
处理方式和SQL语句中的排序是一样的
String hql="from Users order by uid";
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
order by语句只能出现在语句的最后位置
分组
处理方式和SQL语句中分组查询相同
分组语句需要处理筛选,只能使用having语句,而不能使用where语句。
String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno";
String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno having count(e)>=5";
1.6、参数绑定
使用占位参数
String hql="from Users where uid=? or uname=?";
Query query = session.createQuery(hql);
//索引从0开始
query.setInteger(0, 3);//query.setParameter(0, 3);
query.setString(1, "张三");//query.setParameter(1, "张三");
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
使用参数名称
String hql = "from Users where uid=:no1 or uid=:no2";
Query query = session.createQuery(hql);
query.setInteger("no1", 1);
query.setInteger("no2", 3);
//....
可以使用点位参数和名称参数混合使用
String hql = "from User where uid=? or uid=:no2";
Query query = session.createQuery(hql);
query.setInteger(0, 7788);
query.setInteger("no2", 7566);
//....
//使用点位参数和名称参数混合使用,所有点位参数必须放在前面,一旦有名称参数出现,其后将不能再出现占位参数
1.7、连接查询
--SQL语句:查询员工姓名、薪资、部门名称
SELECT ENAME,SAL,DNAME
FROM EMP e JOIN DEPT d ON e.DEPTNO=d.DEPTNO
SELECT ENAME,SAL,DNAME FROM EMP,DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO
没有on语句
能被连接到查询中的必须是主查询对象的子属性
String hql="SELECT e.ename, e.sal, e.dept.dname FROM Emp e";
//HQL连接查询
String hql="SELECT e.ename, e.sal, d.dname FROM Emp e JOIN e.dept d";
String hql = "SELECT e FROM Emp e JOIN e.dept"; //JOIN将没有意义
String hql = "FROM Emp e JOIN e.dept";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
//List集合中的数组中会保存两个元素:
//0:主数据(Emp)
//1:从数据(Dept)
//查询编号为7788的员工信息,同时将对应的dept信息和manager信息查询并保存在对应的子属性中
String hql = "FROM Emp e JOIN FETCH e.dept d JOIN FETCH e.manager m WHERE e.empno=7788";
Query query = session.createQuery(hql);
Emp emp = (Emp) query.uniqueResult();
System.out.println(emp);
System.out.println(emp.getManager());
System.out.println(emp.getDept());
1.8、分页
String hql = "from Users";
Query query = session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(2);
2、QBC查询
QBC(Query By Criteria)查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。
QBC查询最重要的三个类:
Restrictions 条件限制
Projections 列设射
Order 排序
2.1、查询实现
Criteria criteria = session.createCriteria(Users.class);
//session.createCriteria("entity.Users");
//session.createCriteria(Users.class, "别名");
List<Dept> list = criteria.list();
//查询单行结果(如果结果有两行或更多,会报错)
Object uniqueResult = criteria.uniqueResult();
2.2、Projections 列投射
语法:
//查询uname属性
Criteria criteria = session.createCriteria(Users.class);
PropertyProjection property = Projections.property("name");
criteria.setProjection(property);
List<Object> result = criteria.list();
//查询uname, upwd属性
Criteria criteria = session.createCriteria(Users.class);
//1.创建投射列表
ProjectionList projectionList = Projections.projectionList();
//2.向投射列表中添加列投射
PropertyProjection property1 = Projections.property("uname");
PropertyProjection property2 = Projections.property("upwd");
projectionList.add(property1).add(property2);
//3.将投射列表设置到准则中
criteria.setProjection(projectionList);
List<Object> result = criteria.list();
返回值类型 方法名称 描述
PropertyProjection Projections.property 指定某属性
AggregateProjection Projections.avg 求平均值
CountProjection Projections.count 统计某属性的数量
CountProjection Projections.countDistinct 统计某属性不同值的数量
PropertyProjection Projections.groupProperty 指定某个属性为分组属性
AggregateProjection Projections.max 求最大值
AggregateProjection Projections.min 求最小值
ProjectionList Projections.projectionList 创建一个ProjectionList对象
Projection Projections.rowCount 查询结果集中的记录条数
AggregateProjection Projections.sum 求某属性的合计
2.3、Restrictions 条件限制
语法:
Criteria criteria = session.createCriteria(Users.class);
Criterion notNull = Restrictions.isNotNull("comm");
criteria.add(notNull); //添加一个条件(如果添加了多个条件,默认条件之间使用and连接)
List<Users> list = criteria.list();
返回值类型 方法名称 描述
SimpleExpression Restrictions.eq 等于(equal)
Criterion Restrictions.allEq 使用Map,Key/Valu进行多个等于的比对
SimpleExpression Restrictions.gt 大于(great than)
SimpleExpression Restrictions.ge 大于等于(great than or equal)
SimpleExpression Restrictions.lt 小于(less than)
SimpleExpression Restrictions.le 小于等于(less than or equal)
Criterion Restrictions.between 对应SQL的between
SimpleExpression Restrictions.like 对应SQL的like
Criterion Restrictions.in 对应SQL的in
LogicalExpression Restrictions.and and关系
LogicalExpression Restrictions.or or关系
Criterion Restrictions.isNull 为空
Criterion Restrictions.sqlRestriction SQL限定查询
Criterion Restrictions.not 取反
2.3、Order排序
语法:
Criteria criteria = session.createCriteria(Dept.class);
criteria.addOrder(Order.asc("name"))
.addOrder(Order.desc("loc"));
//SELECT * FROM DEPT ORDER BY name ASC, loc DESC
返回值类型 方法名称 描述
Order Order.asc(String propertyName) 升序
Order Order.desc(String propertyName) 降序
2.4、分页查询
Criteria criteria = session.createCriteria(Dept.class);
int pageNum = 2, pageSize = 5;
criteria.setFirstResult((pageNum-1)*pageSize); //查询起始行下标
criteria.setMaxResults(pageSize); //查询的最大行数
List list = criteria.list();
//setFirstResult方法和setMaxResults方法同样可以在SQLQuery及Query类型上使用
3、原生SQL查询
1、查询
String sql = "select uid,uname,upwd from _users";
List list = session.createSQLQuery(sql).list();
for(Object obj : list){
System.out.println(obj);
}
2、 addEntity()
String sql = "select uid,uname,upwd from _users";
// addEntity()可以告诉Hibernate你想要封装成对象的类型,然后自动为你封装
SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);
List<User> list = query.list();
for(Users user : list){
System.out.println(user.getUname());
}
3、 uniqueResult
String sql = "select uid,uname,upwd from _users where uid = 2";
SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);
Users user = (Users) query.uniqueResult();//返回单一对象
System.out.println(user.getUname());
USB Microphone https://www.soft-voice.com/
Wooden Speakers https://www.zeshuiplatform.com/
亚马逊测评 www.yisuping.cn
深圳网站建设www.sz886.com
haibernate的主键生成策略有几种
1. hibernate的主键生成策略:generator元素:表示了一个主键生成器,每个主键都必须定义相应的主键生成策略。它用来为持久化类实例生成唯一的标识 。1.1 程序员自己控制:assigned 1.2 数据库控制: identity sequence 1.3 hibernate控制:increment hilo uuid\/uuid.hex 1.4 其它:native 1.5 自定义主键...
java 面试题
1.描述在Spring中的依赖注入2.ibernate中的延时加载和即时加载的优缺点... 1.描述在Spring中的依赖注入2.ibernate中的延时加载和即时加载的优缺点 展开 我来答 3个回答 #热议# 你发朋友圈会使用部分人可见功能吗?⑨0後哋獊鎟 2009-08-14 知道答主 回答量:1 采纳率:0% 帮助的人:0 我也去...
hibernate怎么读
hibernate怎么读为[ˈhaɪbəneɪt],是冬眠的意思。相关内容如下:一、短语搭配:Hibernate Session传播;Hibernate EntityManager使用;Hibernate PC电脑休眠;ibernate voltage休眠电压;Hibernate Period过冬期;Hibernate Search激活;hibernate drugs冬眠药物;Oxios Hibernate内存整理软件...
动物冬眠的原原因?动物冬眠的原因?
物为食,冬天临近,食物来源就断绝了。但是土拨鼠在自己的体内储存了脂肪。当它无法 继续觅食时,就钻入深洞睡觉。它睡整个冬天,靠储存的脂肪生存。 h ibernate这个词 源自拉丁文,意为"冬天的睡眠"。许多动物,例如熊,并不是真正的冬眠。它们在冬日的睡眠确实比夏日多,但并非冬眠 那样的沉睡。在温暖晴...
java框架组合ssm和ssh各自的优势是什么?
SSM优势:SSM越来越轻量级配置,将注解开发发挥到极致,且ORM实现更加灵活,SQL优化更简便。SSH优势:而SSH较注重配置开发,其中的Hiibernate对JDBC的完整封装更面向对象,对增删改查的数据维护更自动化,但SQL优化方面较弱,且入门门槛稍高。SSH 通常指的是 Struts2 做控制器(controller),spring 管理各...
nested exception is org.hibernate.TransactionException: JDBC ro...
Could not roll back Hibernate transaction; nested exception is org.hibernate.TransactionException: JDBC rollback failed 该句说bibernate中的rollback failed.回滚失败.不能执行事物回滚.Caused by: java.sql.SQLException: Couldn't perform the operation rollback: You can't perform any operations...
JAVA Hibernate工作原理及为什么要用
库中没有就返回null。这个相对比较简单,也没有太大的争议。主要要说明的一点就是在这个版本(bibernate3.2以上)中get方法也会查找二 级缓存!2. Hibernate load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分情况讨论:(1)若为true,则首先在Session缓存中查找,看看...
ssm重点学吗?
总结:SSM和SSH不同主要在MVC实现方式,以及ORM持久化方面不同(Hiibernate与Mybatis)。就目前的行业状况来说,ssm比ssh运用的更加广泛些,ssh已经有淘汰的趋势,一些老公司在用而已。建议不学但是至少了解一下搭建的原理,以便面试的时候回答。这两者是不同的框架,但是能做的东西都差不多。你可以选择...
hibernate 双向关联是不是造成循环依赖
这样是不好!但是有些时候这种依赖是必须的!假设有两个表一个是学生,另一个是学生成绩!学生成绩表有一个学生ID的外键,当你要插入学生成绩的时候,这个学生必须是在学生表里存在的。类的实例都被对方的属性引用其实就是完成他们之间的外键约束,然后保证在插入和修改的时候有级联操作!
hibernate 如何实现延迟加载
ibernate中主要是通过代理(proxy)机制来实现延迟加载。它的具体过程:Hibernate丛数据库获取某一个对象数据时、获取某一 个对象的集合属性值时,或获取某一个对象所关联的另一个对象时,由于没有使用该对象的数据,hibernate并不是数据库加载真正的数据,而只是为该对 象创建一个代理对象来代表这个对象,这个对象上的所有...
安垂万唯: Hibernate查询语言: NativeSQL > HQL > EJBQL > QBC > QBE(query by Example) 可以用的就是这些.
大同市18538447564: Hibernate的几种查询方式 - ?
安垂万唯: HIbernate主要常用有三种查询方式HQL、QBC、SQL:1).HQL(Hibernate Query Language):hibernate数据查询语言;2).QBC(Query By Criteria):规则查询3).SQL:原生的SQL语句(较为复杂的情况下使用) 想要详细了解的可以看一下下面的几篇文章:QBC数据查询HQL单表查询HQL多表查询 希望对你有所帮助~
大同市18538447564: Hibernate有哪几种查询数据的方式 - ?
安垂万唯: hibernate有三种方式:1.HQL查询2.QBC查询3.本地SQL查询
大同市18538447564: Hibernate 有哪几种查询数据的方式 - ?
安垂万唯: 有三种方式,不过不是楼上说的那三种.1.HQL查询2.QBC查询3.本地SQL查询
大同市18538447564: Hibernate有那几种查询数据的方式?
安垂万唯: 有三种查询方式 1.HQL:Hibernate Qusery Language ,它跟SQL非常相像. 2.Criteria Query ,以对象的方式添加查询条件. 3.sql ,直接使用sql语句操作数据库.详细参考: http://dev.csdn.net/article/68/68297.shtm
大同市18538447564: Hibernate有哪几种查询数据的方法 - ?
安垂万唯: 转录: 从点到面,讲讲hibernate查询的6种方法.分别是HQL查询 ,对象化查询Criteria方法,动态查询DetachedCriteria,例子查询,sql查询,命名查询. 如果单纯的使用hibernate查询数据库只需要懂其中的一项就可以完成想要实现的一般功能
大同市18538447564: hibernate查询有几种方式 - ?
安垂万唯: HQL、Criteria、SQL
大同市18538447564: 关于Hibernate的三种查询方式. - ?
安垂万唯: hql提供了更接近于传统SQL语句的查询语法,容易过度吧,官方推荐使用,它提供强大的查询功能.一般使用这种查询.Criteria查询,可移植性好,用起来也很方便,当你的查询条件很多时,可用Example创建一查询依据,查出属性与之类似的对象,代码简洁运用很方便.Native SQL一般在遇到很复杂的查询条件时使用.说白了,灵活运用就行,在不同情况下使用不同的解决方案,建议你多看些实例,见得多了用起来就比较容易判断该用哪一个.如果问题解决,请点赞采纳,谢谢!!!
大同市18538447564: Hibernate有那几种查询数据的方式 - ?
安垂万唯: Sql、Criteria,object comptosition Hql:1、 属性查询2、 参数查询、命名参数查询3、 关联查询4、 分页查询5、 统计函数
大同市18538447564: hibernate怎样查询数据库里面的所有数据 - ?
安垂万唯: Hibernate查询所有数据的操作方式有三种.1、Query (1)使用该方法查询时,不需要编写sql语句,但是需要编写hql(Hibernate Query Language)语句,该语句是Hibernate查询语言.(2)hql语言操作的是实体类和实体类的属性,比如查询所有数据...