Hibernate-Criteria学习笔记
hibernate_jpa注解
目前最新版的hibernate,5.2,底层整合了jpa,用idea的hibernate工具生成实体时,实体包含了注解的配置文件,缺一不可
如,用户类实体,生成之后是这样子的


cascade属性的可能值有
all: 所有情况下均进行关联操作,即save-update和delete。
none: 所有情况下均不进行关联操作。这是默认值。
save-update: 在执行save/update/saveOrUpdate时进行关联操作。
delete: 在执行delete 时进行关联操作。
all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点。
比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,
此book即成为孤儿节点。
hibernate_Criteria用法『转』
外键查询
- 对于外键本身
public Resume findByUserId(Long id) {
Criteria cr=getCurrentSession().createCriteria(Resume.class);
cr.add(Restrictions.eq("user.id",id));
return (Resume) cr.list().get(0);
} - 对于外键对象的属性
public Resume findByAttr(Attr attr) {
Criteria cr=getCurrentSession().createCriteria(Resume.class);
cr.createAlias("user","u");
cr.add(Restrictions.eq("u.attr",attr));
return cr.list();
}
hibernate_Restrictions用法『转』
| 方法 | 说明 |
| Restrictions.eq | = |
| Restrictions.allEq | 利用Map来进行多个等于的限制 |
| Restrictions.gt | > |
| Restrictions.ge | >= |
| Restrictions.lt | < |
| Restrictions.le | <= |
| Restrictions.between | BETWEEN |
| Restrictions.like | LIKE |
| Restrictions.in | in |
| Restrictions.and | and |
| Restrictions.or | or |
| Restrictions.isNull | 判断属性是否为空,为空则返回true |
| Restrictions.isNotNull | 与isNull相反 |
| Restrictions.sqlRestriction | 用SQL限定查询 |
| Order.asc | 根据传入的字段进行升序排序 |
| Order.desc | 根据传入的字段进行降序排序 |
| MatchMode.EXACT | 字符串精确匹配.相当于"like 'value'" |
| MatchMode.ANYWHERE | 字符串在中间匹配.相当于"like '%value%'" |
| MatchMode.START | 字符串在最前面的位置.相当于"like 'value%'" |
| MatchMode.END | 字符串在最后面的位置.相当于"like '%value'" |
Disjunction:逻辑或【or】
Conjunction:逻辑与【and】
一、进行子查询并分页
背景:
有一张活动表(volunteer_activity)
和一张活动报名表(volunteer_sign_up)–存放志愿者活动报名记录
要求:查出志愿者参加的活动和未参加的活动
代码:
/**
* 查询已加入的活动
* @param key
* @param setPageSize
* @return
*/
@Override
public PageBean findAllVolunteerJoinActivity(String key, PageBean<VolunteerActivityEntity> setPageSize, String userId) { Session session = sessionFactory.openSession(); /**
* hibernate 利用子查询实现 exists 功能
*/
Criteria criteria = session.createCriteria(VolunteerActivityEntity.class, "activity");
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(VolunteerSignUpEntity.class,"signUp");
detachedCriteria.add(Restrictions.eq("volunteerId", userId));
detachedCriteria.add(Property.forName("activity.activityId").eqProperty("signUp.activityId"));
criteria.add(Subqueries.exists(detachedCriteria.setProjection(Projections.property("signUp.signUpId"))));//这里改为notExists就是查询未参加的活动了 if (key != null && !key.equals("")) {
//搜索
List list = criteria.add(
Restrictions.or(
Restrictions.or(Restrictions.like("activityCode", key, MatchMode.ANYWHERE)),
Restrictions.or(Restrictions.like("activityTitle", key, MatchMode.ANYWHERE)),
Restrictions.or(Restrictions.like("activityContent", key, MatchMode.ANYWHERE)),
Restrictions.or(Restrictions.like("activityLeader", key, MatchMode.ANYWHERE))))
.setFirstResult((setPageSize.getCurrPage() - 1) * setPageSize.getPageSize() )
.setMaxResults((setPageSize.getCurrPage() - 1) * setPageSize.getPageSize() + setPageSize.getPageSize()).list();
setPageSize.setRows(list);
} else {
setPageSize.setRows(criteria.setFirstResult((setPageSize.getCurrPage() - 1) * setPageSize.getPageSize())
.setMaxResults((setPageSize.getCurrPage() - 1) * setPageSize.getPageSize() + setPageSize.getPageSize()).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list());
} session.close(); return setPageSize;
}
查询结果:
Hibernate:
select
this_.activity_id as activity1_3_0_,
this_.activity_code as activity2_3_0_,
this_.activity_content as activity3_3_0_,
this_.activity_end_time as activity4_3_0_,
this_.activity_leader as activity5_3_0_,
this_.activity_people_num as activity6_3_0_,
this_.activity_sign_end_time as activity7_3_0_,
this_.activity_sign_start_time as activity8_3_0_,
this_.activity_start_time as activity9_3_0_,
this_.activity_title as activit10_3_0_
from
volunteer_activity this_
where
exists (
select
signUp_.sign_up_id as y0_
from
volunteer_sign_up signUp_
where
signUp_.volunteer_id=?
and this_.activity_id=signUp_.activity_id
) limit ?
二、利用逻辑对象进行多条件查询
背景:
有一张竞赛表(competition)
要求:给一个部门id,查出本部门的竞赛,并模糊参训
代码:
@Override
public PageBean findByDept(Integer deptId, String key, PageBean<CompetitionEntity> pageBean) { Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(CompetitionEntity.class); //TODO 伪外键查询--首要条件
criteria.add(Restrictions.eq("deptId", deptId)); if (key != null && !key.equals("")) { //搜索--实现:where deptId=? and (xxx like ? or xxx like ?...)
Disjunction dis = Restrictions.disjunction();//多个or可以拼接
dis.add(Restrictions.like("itemName", key, MatchMode.ANYWHERE));
List list = criteria.add(dis)
.setFirstResult((pageBean.getCurrPage() - 1) * pageBean.getPageSize() )
.setMaxResults(pageBean.getPageSize()).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
pageBean.setRows(list);
} else { pageBean.setRows(
criteria.setFirstResult((pageBean.getCurrPage() - 1) * pageBean.getPageSize())
.setMaxResults(pageBean.getPageSize()).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list());
} pageBean.setTotal(Math.toIntExact((Long) session.createCriteria(CompetitionEntity.class).add(Restrictions.eq("deptId", deptId))
.setProjection(Projections.rowCount()).uniqueResult())); session.close(); return pageBean;
}
查询结果:
Hibernate:
select
this_.item_id as item_id1_2_0_,
this_.awardee as awardee2_2_0_,
this_.dept_id as dept_id3_2_0_,
this_.dept_name as dept_nam4_2_0_,
this_.item_name as item_nam5_2_0_,
this_.match_id as match_id6_2_0_,
this_.match_name as match_na7_2_0_,
this_.prize_grade as prize_gr8_2_0_,
this_.prize_img as prize_im9_2_0_,
this_.prize_level as prize_l10_2_0_,
this_.prize_time as prize_t11_2_0_,
this_.teacher_id as teacher12_2_0_,
this_.teacher_name as teacher13_2_0_
from
competition this_
where
this_.dept_id=?
and (
this_.item_name like ?
) limit ?
三、外键查询
背景:
有一张教师表(sys_user),与部门表(dept)存在外键约束;
注:
生成实体时,可以双向多对一,一个部门对应多个老师,但电脑吃不消
也可以用单向一对一,只对教师进行关联,这个最简单,为使用这个要求:给一个部门id,查出本部门的竞赛,并模糊参训
代码:
@Override
public PageBean findByDept(Integer deptId, String key, PageBean<TeacherEntity> pageBean) { Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(TeacherEntity.class);
Criteria criteriaForCount = session.createCriteria(TeacherEntity.class);//用于获取数据库记录数 //TODO 外键查询
criteria.createAlias("dept", "dept").
add(Restrictions.eq("dept.deptId", deptId));
criteriaForCount.createAlias("dept", "dept").
add(Restrictions.eq("dept.deptId", deptId)); if (key != null && !key.equals("")) { //搜索--实现:where deptId=? and (xxx like ? or xxx like ?...)
Disjunction dis = Restrictions.disjunction();//多个or可以拼接
dis.add(Restrictions.like("teacherCode", key, MatchMode.ANYWHERE));
dis.add(Restrictions.like("teacherName", key, MatchMode.ANYWHERE));
List list = criteria.add(dis)
.setFirstResult((pageBean.getCurrPage() - 1) * pageBean.getPageSize() )
.setMaxResults(pageBean.getPageSize()).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
pageBean.setRows(list);
} else {
pageBean.setRows(criteria.setFirstResult((pageBean.getCurrPage() - 1) * pageBean.getPageSize())
.setMaxResults(pageBean.getPageSize()).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list());
} pageBean.setTotal(Math.toIntExact((Long) criteriaForCount.setProjection(Projections.rowCount()).uniqueResult())); session.close(); return pageBean;
}
Hibernate-Criteria学习笔记的更多相关文章
- hibernate框架学习笔记11:Criteria查询详解
创建实体类对象: package domain; import java.util.HashSet; import java.util.Set; //客户实体 public class Custome ...
- hibernate框架学习笔记7:HQL查询、Criteria查询简介
HQL查询:hibernate独有的查询语言 适用于不复杂的多表查询 示例: 实体类: package domain; public class Customer { private Long cus ...
- j2ee开发之hibernate框架学习笔记
hibernate框架技术重点学习笔记 1.针对不同的数据库,有不同的数据库实现类,使其符号对应的数据库? mysqlDaoImpl oracleDaoImpl ... ... 2.对象和表记录的转换 ...
- Hibernate 系列 学习笔记 目录 (持续更新...)
前言: 最近也在学习Hibernate,遇到的问题差不多都解决了,顺便把学习过程遇到的问题和查找的资料文档都整理了一下分享出来,也算是能帮助更多的朋友们了. 最开始使用的是经典的MyEclipse,后 ...
- hibernate框架学习笔记10:HQL查询详解
HQL语句中不可以出现与表有关的内容,而是对象的属性 实体类(注意配置文件): package domain; import java.util.HashSet; import java.util.S ...
- hibernate框架学习笔记6:事务
MySQL的事务.JDBC事务操作: 详细见这篇文章:比较详细 http://www.cnblogs.com/xuyiqing/p/8430214.html 如何在hibernate中配置隔离级别: ...
- hibernate框架学习笔记3:API详解
Configuration对象: package api; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configur ...
- Hibernate框架学习笔记
Hibernate 是一个 JDO( Java Data Objects)工具.它的工作原理是通过文件把值对象(Java对象)和 数据库表之间建立起一个映射关系,还提供数据查询和获取数据的方法. ...
- Hibernate个人学习笔记(2)
新增改查的操作 一.cfg.xml配置 <?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration ...
- Hibernate个人学习笔记(1)
连接池c3p0所需jar包:Hiberbate开发包-lib-optional-c3p0下全部Jar包 Hiberbate连接池参数配置:Hiberbate开发包-project-etc-hibern ...
随机推荐
- apk反编译(仅供娱乐)
第一个文件夹里面放apk,第二个解析classes.dex,第三个查看java代码,下面三个apktool用来解析apk文件, 记得在环境变量中配置apktool,路径为apktool所在路径 1.解 ...
- 【NOIP2016提高组day2】愤怒的小鸟
分析 Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于 (0, 0) 处,每次Kiana可以用它向第一象限发射一只红色的小鸟, 小鸟们的飞行轨迹均 ...
- grpc:gRPC Concepts
本文介绍一些主要的gRPC概念. 服务定义 gRPC支持4种方法: 1.Unary RPCs where the client sends a single request to the server ...
- ubuntu 安装 tar.gz 文件
ubuntu 安装 tar.gz 文件 本文链接:https://blog.csdn.net/caloriesung/article/details/81536144 tar zxvf FileNam ...
- 编译依赖ndt_gpu库的包,遇到Eigen报错
背景: 使用NDT建图,帧率比较慢,打算使用gpu加速计算. ndt_gpu是一个使用gpu加速ndt计算的库,首先在工作空间编译这个包. 然后在ndtMap包中链接这个库,其CMakelists.t ...
- 指定文件或文件夹直接提交到svn指定目录
我这里先说两种方法第一种:1.先将那个目录checkout下来2.将要添加的文件或者文件夹放到这个目录中3.右击文件执行svn菜单中的add命令4.右击文件执行svn菜单中的commit命令第二种:如 ...
- BZOJ 2716 [Violet 3]天使玩偶 (CDQ分治、树状数组)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2716 怎么KD树跑得都那么快啊..我写的CDQ分治被暴虐 做四遍CDQ分治,每次求一个 ...
- Selenium-webdriver+八种元素定位
进行Web页面自动化测试,对页面上的元素进行定位和操作是核心.而操作又是以定位为前提的,因此,对页面元素的定位是进行自动化测试的基础. 页面上的元素就像人一样,有各种属性,比如元素名字,元素id,元素 ...
- 2.Python环境搭建Window、mac、linux
1.Windows安装Python详解 使用任何高级编程语言都需要有一个自己的编程环境,Python 也不例外.只要使用 Python,就必须要配置 Python 的开发和运行环境. Python 本 ...
- Java中参数的引用传递和值传递
1.一些定义 值传递:把实际传入参数的值,在内存中赋值一份 引用传递:传入的是实际参数的地址 2.传递基本类型的参数 因为Java是值传递,那就不难理解下面的代码不交换任何值 swap(Type ar ...
