Hibernate框架中Criteria语句
在Hibernate中有一种查询语句是Criteria查询(QBC查询),今天呢 我们就一个个的详细的跟大家一起探讨Criteria语句的相关知识点
案例前的准备
//插入测试数据,构建数据库
public static void insertInfo(){
//获取Session
Session session=HibernateUtil.currentSession(); //开启事务
Transaction tx = session.beginTransaction(); //构建班级
Grade grade=new Grade("超级无敌宇宙班","炒鸡不错");
//构建第二个班级
Grade grade2=new Grade("超级班","很不错");
//构建学生
Student stu1=new Student("高冷小伙3","男");
Student stu2=new Student("高冷小伙4","女");
//指定关系
grade.getStus().add(stu1);
grade.getStus().add(stu2);
//保存班级
session.save(grade);
session.save(grade2);
//提交事务
tx.commit();
//关闭连接
HibernateUtil.closeSession();
}
案例一:查询所有学生信息(Criteria)
//使用Criteria语句查询所有学生信息
public static void selectStu(){
//获取session
Session session=HibernateUtil.currentSession();
//开启事务
Transaction tx = session.beginTransaction();
//使用Criteria查询
Criteria criteria = session.createCriteria(Student.class);
List<Student> list = criteria.list();
for (Student stu : list) {
System.out.println(stu.getSname());
System.out.println(stu.getSex());
}
//提交事务
tx.commit();
//关闭连接
HibernateUtil.closeSession();
}
经过以上语句我们可以看到的查询结果如下:
案例二:查询男生的信息(带条件查询)(Restrictions.eq())
//使用Criteria语句带条件查询学生信息
public static void selectStuWhere(){
//获取session
Session session=HibernateUtil.currentSession();
//开启事务
Transaction tx = session.beginTransaction();
//使用Criteria查询
Criteria criteria = session.createCriteria(Student.class).add(Restrictions.eq("sex", "男"));
List<Student> list = criteria.list();
for (Student stu : list) {
System.out.println(stu.getSname());
System.out.println(stu.getSex());
}
//提交事务
tx.commit();
//关闭连接
HibernateUtil.closeSession();
}
查询结果如下:
案例三:关联查询,查询班级下的学生信息(Restrictions.eq())
//查询班级为超级无敌宇宙班的班级学生信息
public static void selectStuWhereGrade(){
//获取session
Session session=HibernateUtil.currentSession();
//开启事务
Transaction tx = session.beginTransaction();
//使用Criteria查询
Criteria criteria = session.createCriteria(Grade.class).add(Restrictions.eq("gname", "超级无敌宇宙班"));
List<Grade> list = criteria.list();
for (Grade gra : list) {
for(Student stu:gra.getStus()){
System.out.println(stu.getSname());
}
}
//提交事务
tx.commit();
//关闭连接
HibernateUtil.closeSession();
}
查询结果如图:
案例四:关联查询,查询班级下的学生信息(取别名的方式)(Restrictions.eq())
//查询班级为超级无敌宇宙班的班级学生信息(方式二:取别名)
public static void selectStuWhereGradeAsName(){
//获取session
Session session=HibernateUtil.currentSession();
//开启事务
Transaction tx = session.beginTransaction();
//使用Criteria查询
Criteria criteria = session.createCriteria(Student.class);
//取别名
criteria.createAlias("grade", "g");
Criterion criterion= Restrictions.eq("g.gname", "超级无敌宇宙班");
criteria.add(criterion);
List<Student> list = criteria.list();
for (Student stu : list) {
System.out.println(stu.getSname());
}
//提交事务
tx.commit();
//关闭连接
HibernateUtil.closeSession();
}
查询结果如图
案例五:范围查询 查询名字是高冷小伙3和高冷小伙4的学生信息(Restrictions.in())
//范围查询 查询名字是高冷小伙3和高冷小伙4的学生信息
public static void selectStuWhereName(){
//获取session
Session session=HibernateUtil.currentSession();
//开启事务
Transaction tx = session.beginTransaction();
//使用Criteria查询
Criteria criteria = session.createCriteria(Student.class);
List lists=new ArrayList();
lists.add("高冷小伙3");
lists.add("高冷小伙4");
Criterion criterion= Restrictions.in("sname", lists);
criteria.add(criterion);
List<Student> list = criteria.list();
for (Student stu : list) {
System.out.println(stu.getSname());
}
//提交事务
tx.commit();
//关闭连接
HibernateUtil.closeSession();
}
查询结果如图
案例六:模糊查询,查询学生姓名中有3的学生名称(Restrictions.like())
//模糊查询,查询学生姓名中有3的学生名称
public static void selectStuLike(){
//获取session
Session session=HibernateUtil.currentSession();
//开启事务
Transaction tx = session.beginTransaction();
//使用Criteria查询
Criteria criteria = session.createCriteria(Student.class);
//如果是 ilike的话是不区分大小写的
//Criterion criterion= Restrictions.like("sname", "%3%");
//或者是采用如下方式,则可以省略%%
Criterion criterion= Restrictions.like("sname", "",MatchMode.ANYWHERE);
criteria.add(criterion); List<Student> list = criteria.list();
for (Student stu : list) {
System.out.println(stu.getSname());
}
//提交事务
tx.commit();
//关闭连接
HibernateUtil.closeSession();
}
查询结果如图
案例七:逻辑控制 多条件查询 查询性别为男 名字中有 3的学生信息(Restrictions.and())
//逻辑控制 多条件查询 查询性别为男 名字中有 3的学生信息
public static void selectStuManyWhere(){
//获取session
Session session=HibernateUtil.currentSession();
//开启事务
Transaction tx = session.beginTransaction();
//使用Criteria查询
Criteria criteria = session.createCriteria(Student.class); //条件1
Criterion c1= Restrictions.like("sname", "",MatchMode.ANYWHERE);
//条件2
Criterion c2= Restrictions.eq("sex","男");
//整合条件 and
Criterion criterion=Restrictions.and(c1, c2); criteria.add(criterion); List<Student> list = criteria.list();
for (Student stu : list) {
System.out.println(stu.getSname());
}
//提交事务
tx.commit();
//关闭连接
HibernateUtil.closeSession();
}
查询结果如图
案例八:非空检查 查询没有学生的班级(Restrictions.isEmpty())
//非空检查 查询没有学生的班级
public static void selectNotStuGrade(){
//获取session
Session session=HibernateUtil.currentSession();
//开启事务
Transaction tx = session.beginTransaction();
//使用Criteria查询
Criteria criteria = session.createCriteria(Grade.class); Criterion criterion=Restrictions.isEmpty("stus"); criteria.add(criterion); List<Grade> list = criteria.list();
for (Grade grade : list) {
System.out.println(grade.getGname());
}
//提交事务
tx.commit();
//关闭连接
HibernateUtil.closeSession();
}
查询结果如图
案例九:动态查询 查询 学号大于0 名字中有3的学生信息(Criteria.add())
//动态查询 查询 学号大于0 名字中有3的学生信息
public static void selectStuDynamic(){
//获取session
Session session=HibernateUtil.currentSession();
//开启事务
Transaction tx = session.beginTransaction();
//使用Criteria查询
Criteria criteria = session.createCriteria(Student.class); //准备两个变量当成是前台穿过来的条件
Integer stuno=;
String stuname=""; //动态拼接
if(stuno!=null){
criteria.add(Restrictions.gt("sid",stuno));
}
if(stuname!=null){
criteria.add(Restrictions.ilike("sname",stuname,MatchMode.ANYWHERE));
} List<Student> list = criteria.list();
for (Student stu : list) {
System.out.println(stu.getSname());
}
//提交事务
tx.commit();
//关闭连接
HibernateUtil.closeSession();
}
查询结果如图
案例十:排序 查询学号大于0的学生按照学号降序排列(criteria.addOrder())
//排序 查询学号大于0的学生按照学号降序排列
public static void selectStuOraderby(){
//获取session
Session session=HibernateUtil.currentSession();
//开启事务
Transaction tx = session.beginTransaction();
//使用Criteria查询
Criteria criteria = session.createCriteria(Student.class); Criterion criterion=Restrictions.gt("sid", ); criteria.add(criterion).addOrder(Order.desc("sid")); List<Student> list = criteria.list();
for (Student stu : list) {
System.out.println(stu.getSname());
}
//提交事务
tx.commit();
//关闭连接
HibernateUtil.closeSession();
}
查询结果如图
案例十一:分页查询 查询第二页数据 每页显示一条记录(criteria.setMaxResults()和criteria.setFirstResult())
//分页查询 查询第二页数据 每页显示一条
public static void selectStuPage(){
//获取session
Session session=HibernateUtil.currentSession();
//开启事务
Transaction tx = session.beginTransaction();
//使用Criteria查询
Criteria criteria = session.createCriteria(Student.class); /*//显示总记录数
Projection projection = Projections.count("sid");
criteria.setProjection(projection);
int count = ((Long)criteria.uniqueResult()).intValue();
System.out.println("总记录数为:"+count);*/ //准备两个变量
int pageSize=;//每页显示的条数
int pageIndex=;//第几页 criteria.setMaxResults(pageSize);
criteria.setFirstResult((pageIndex-)*pageSize); List<Student> list = criteria.list();
for (Student stu : list) {
System.out.println(stu.getSid());
System.out.println(stu.getSname());
}
//提交事务
tx.commit();
//关闭连接
HibernateUtil.closeSession();
}
查询结果如图
案例十二:使用DetachedCriteria查询超级无敌宇宙班的所有学生信息(DetachedCriteria)
//使用DetachedCriteria查询超级无敌宇宙班的所有学生信息
public static void detachedCriteria(){
//获取session
Session session=HibernateUtil.currentSession(); //构建一个DetachedCriteria对象
DetachedCriteria detachedCriteria=DetachedCriteria.forClass(Student.class);
//取别名
detachedCriteria.createAlias("grade", "g");
//查询
Criterion criterion= Restrictions.eq("g.gname", "超级无敌宇宙班");
//绑定
detachedCriteria.add(criterion); //引入session
List<Student> list = detachedCriteria.getExecutableCriteria(session).list(); for (Student stu : list) {
System.out.println(stu.getSid());
System.out.println(stu.getSname());
}
}
结果如图
通过以上几种方式就差不多完成了Criteria查询的常用的知识点了!
Hibernate框架中Criteria语句的更多相关文章
- hibernate框架中注意的几个问题
使用hibernate框架中,session.createSQLQuery创建sql语句的时候遇到的问题 1. select e.id,d.id from emp e,dept d where e. ...
- 关于HttpSession 和 Hibernate框架中 session异同点的简单解析
快速理解: HttpSession中的session是一个容器用来盛基于会话机制的信息. 比喻:我把钱放进银行的保险柜里. 解析:我的钱就是我的信息,ID等 银行的保险柜就是session容器. Hi ...
- 详解Java的MyBatis框架中SQL语句映射部分的编写
这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件 ...
- Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)
写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...
- Hibernate框架之Criteria 详解
自从学数据库以来,从SQL查询-HQL查询-到Criteria 查询.有人问我:掌握一种查询语句不就可以吗,为什么还要学Criteria 查询?我回答道:用到特定于数据库的SQL 语句,程序本身会依赖 ...
- Hibernate框架中的HibernateUtil
对于刚学习三层框架的人来说.每个配置文件和每个类.以及功能来说都非常新奇,时常就忘记了相关类的功能. 在这里建议编程就是要多加练习,才干熟能生巧. 这里说一下HibernateUtil类,在使用Hib ...
- JavaWeb_(Spring框架)在Struts+Hibernate框架中引入Spring框架
spring的功能:简单来说就是帮我们new对象,什么时候new对象好,什么时候销毁对象. 在MySQL中添加spring数据库,添加user表,并添加一条用户数据 使用struts + hibern ...
- 在hibernate框架中配置显示sql语句
使用Hibernate的框架开发时,可在Hibernate.cfg.xml中加上 <property name="hibernate.show_sql">true< ...
- Hibernate框架之Criteria查询
首先给大家说说Hibernate检索方式 Hibernate提供了5种检索对象的方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象 2.OID检索方式:按照对象的OID来检索对象 3.HQ ...
随机推荐
- 纯命令行的编辑利器:用好 awk 与 sed
awk 的基本语法 awk 是模式查找与处理语言,是文本处理的利器.使用 awk 可以只用一条简单的命令完成复杂的文本数据处理. awk 命令的基本结构为: awk '模式 {处理}' 文件 比如,打 ...
- Chrome开发者工具不完全指南(四、性能进阶篇)
前言 Profiles面板功能的作用主要是监控网页中各种方法执行时间和内存的变化,简单来说它就是Timeline的数字化版本.它的功能选项卡不是很多(只有三个),操作起来比较前面的几块功能版本来说简单 ...
- Android-异步任务-AsyncTask
什么是异步任务? 异步任务就是开一个子线程,然后让它去跑,它跑完了就会回来告诉你说,它跑完了,这是结果.这和Java中的回调差不多.我们在OKHttp中很长见到的 onSuccess() 和 onEr ...
- IDE:IDEA Commit Changes Dialog local changes refresh
IDEA提交代码,一直卡着不动,显示:Commit Changes Dialog local changes refresh 修改方法为: go to settings - version contr ...
- Java接口和抽象类的区别
今天看到项目中,写了一个抽象类,里面有很多方法继承了这类,当调用这个接口时,采用的是这个抽象类去调方法的,当时一想,这个不就是我们说的Java的多态的特征: 继承:存在继承关系的子类和父类 重写:子类 ...
- 轻量级前端MVVM框架avalon - ViewModel
废话说了大几篇,我们开始来点干货了~ ViewModel的内部机制 在MVVM中,数据是核心.而jQuery则以DOM为核心. 而DOM只是HTML在JS的世界的抽象,是一个很易变的东西.因此如果业务 ...
- lua中的string类型
在lua中用union TString来表示字符串类型 lobject.h: 其中结构体tsv中 reserved字段表示字符串是不是保留关键字,hash是其哈希值,len是其长度.我们在TStrin ...
- Android混淆代码
Android代码混淆是必须的,java层代码如果不做混淆等于把源代码送人了.那如何做混淆呢? 之前一般都是提到采用proguard.cfg,但使用新版本ADT后没有这个文件了,取而代之的是progu ...
- 2014年百度之星程序设计大赛 - 初赛(第二轮)JZP Set
题目描述:一个{1, ..., n}的子集S被称为JZP集,当且仅当对于任意S中的两个数x,y,若(x+y)/2为整数,那么(x+y)/2也属于S.例如,n=3,S={1,3}不是JZP集,因为(1+ ...
- 恢复MySQL主从数据一致性的总结
今日上午,同事告知,MySQL主从数据库的数据不一致,猜测备库在同步过程中出现了问题,于是,登上备库,使用 mysql> show slave status\G查看,果然,备库在insert语句 ...