Hibernate的Disjunction和Conjunction
关于Disjunction和Conjunction的如何使用?
本人在学习阶段也曾在百度搜索,但是找到后,感觉描述的不太直白,思考良久才看懂是什么意思。故此在此小结一下。
以Oracle数据库的scott用户下的Emp 和Dept表为例
假如我们现在面临这样的一个问题
/** 1.从员工表里面查询出20号部门下名字里包含S,或者工资在800以上。 * 并且职位名称开头带有M or comm属性不位null 的人。* 要求:使用hibernate的Criteria相关技术实现*/
当我们遇到这样的问题时,可能首先会想到这样做
Criteria criteria = session.createCriteria(Emp.class);Dept d = new Dept();d.setDeptno((byte) 20);criteria.add(Restrictions.or(Restrictions.like("ename", "S", MatchMode.ANYWHERE),Restrictions.gt("sal", 800d)));criteria.add(Restrictions.or(Restrictions.like("job", "M", MatchMode.START),Restrictions.isNotNull("comm")));List<Emp> list = criteria.list();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
这样做,当然是可以,但是有没有更好的做法呢。当然是有的,就是现在我们要说的disjuction和conjunction
逻辑或 和 逻辑 与 。简单来说,就是说 or 和 and
为什么说它好用呢。因为它支持自定义sql语句
使用如下:
Criteria criteria = session.createCriteria(Emp.class);Dept d = new Dept();d.setDeptno((byte) 20);criteria.add(Restrictions.eq("dept", d));//找到20号部门下的员工// 逻辑或Disjunction disjunc = Restrictions.disjunction();Criterion cri = Restrictions.sqlRestriction("ename like '%S%' or sal >800");//disjunc.add(cri);//自定义sql语句添加 or 条件// 逻辑与Conjunction conjunc = Restrictions.conjunction();cri = Restrictions.sqlRestriction("job like 'M%' and comm is null");conjunc.add(cri); //自定义sql语句添加 and条件criteria.add(disjunc); //将 or 条件 添加到criteriacriteria.add(conjunc); //将 and条件 添加到criteriaList<Emp> list = criteria.list();System.out.println("结果:");for (Emp Emp : list) {System.out.println(Emp.getEname() + "\t" + Emp.getJob());}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
编译出来的sql语句如下:
Hibernate: selectthis_.EMPNO as EMPNO1_0_,this_.DEPTNO as DEPTNO1_0_,this_.ENAME as ENAME1_0_,this_.JOB as JOB1_0_,this_.MGR as MGR1_0_,this_.HIREDATE as HIREDATE1_0_,this_.SAL as SAL1_0_,this_.COMM as COMM1_0_ fromSCOTT.EMP this_ wherethis_.DEPTNO=? and (ename like '%S%' or sal >800) and (job like 'M%' and comm is null)
结果:
JONES MANAGER
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
,看到这里,我们可以试试,将
disjunc.add(conjunc);//将and添加到or条件里面是什么效果criteria.add(disjunc);//最后将or条件加入criteria中
- 1
- 2
- 1
- 2
让我们来看一下编译的sql语句
Hibernate: selectthis_.EMPNO as EMPNO1_0_,this_.DEPTNO as DEPTNO1_0_,this_.ENAME as ENAME1_0_,this_.JOB as JOB1_0_,this_.MGR as MGR1_0_,this_.HIREDATE as HIREDATE1_0_,this_.SAL as SAL1_0_,this_.COMM as COMM1_0_ fromSCOTT.EMP this_ wherethis_.DEPTNO=? and (ename like '%S%' or sal >800 or (job like 'M%' and comm is null))
结果:
JONES MANAGER
SCOTT ANALYST
ADAMS CLERK
FORD ANALYST
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
发现了什么?我们的and 条件被内置了。有兴趣的可以尝试下这样做。
conjunc.add(disjunc);criteria.add(conjunc);
- 1
- 2
- 1
- 2
看看结果是什么吧。
Hibernate: selectthis_.EMPNO as EMPNO1_0_,this_.DEPTNO as DEPTNO1_0_,this_.ENAME as ENAME1_0_,this_.JOB as JOB1_0_,this_.MGR as MGR1_0_,this_.HIREDATE as HIREDATE1_0_,this_.SAL as SAL1_0_,this_.COMM as COMM1_0_ fromSCOTT.EMP this_ wherethis_.DEPTNO=? and (job like 'M%' and comm is null and (ename like '%S%' or sal >800))
结果:
JONES MANAGER
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
又发现了什么?我们的or条件被内置了!!!
disjunction和conjunction 个人感觉比Criteria的内置的运算函数好用,不过还要看个人喜好了。
Hibernate的Disjunction和Conjunction相关推荐
- hibernate: 用Disjunction和Conjunction构造复杂的查询条件
Disjunction 与 Conjunction 表示逻辑或与逻辑与 可以构造复杂的Sql 语句 Disjunction disjunction = Restrictions.disjunction ...
- HIBERNATE:disjunction和conjunction构造复杂的查询条件.
工作中小结:(1) 查询某个批次的数据,也还可以输入州/县/医疗机构(这三个是或者的关系)://disjunction或者 关系:[ 批次的数据 && (州 || 县 | ...
- hibernate 管理 Session(单独使用session,非spring)
hibernate 管理 Session(单独使用session,非spring) Hibernate 自身提供了三种管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 S ...
- (3) Hibernate的查询 标准(Criteria)查询
Hibernate的查询 标准(Criteria)查询 1 一个简单例子: Java代码 @SuppressWarnings("unchecked") public void ...
- Hibernate:DisjunctionConjunction构造复杂的查询条件
HIBERNATE:DISJUNCTION&CONJUNCTION构造复杂的查询条件. Hibernate:Disjunction&Conjunction构造复杂的查询条件 Disju ...
- Hibernate:DisjunctionConjunction构造复杂的查询条件.
Hibernate:Disjunction&Conjunction构造复杂的查询条件 Disjunction和Conjunction是逻辑或和逻辑与,如下: 用来组合一组逻辑或[or]条件的方 ...
- Knowledge 3命题逻辑形式推演(resolution归结原理- -- 1条规则)
目录 一.写在前面 二.resolution归结原理 2.1 什么是resolution归结原理 2.2 怎么将一个任何一个式子改写成CNF合取范式的形式 2.3 利用归结原理和反证法证明 ...
- 人工智能 归结原理实验报告
归结原理实验 一.实验目的 加深学生对归结原理进行定理证明过程的理解,掌握基于谓词逻辑的归 结过程中子句变换过程.替换与合一算法即归结策略等重要环节,进一步了解实 现机器自动定理证明的步骤. 二.实验 ...
- 人工智能归结原理实验
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.流程 二.步骤 0.声明 1.消去蕴含词和等值词 2.使否定词仅作用于原子公式 3.使量词间不含同名指导变元 4. ...
最新文章
- 如何在Laravel 中对大文件进行加密?
- Go 语言编程 — 高级数据类型 — Slice 切片
- JAVA基础知识要点
- CentOS 7 搭建JAVA环境
- 这可不是一般的便宜哦!
- 谈谈软件工程与计算机科学的区别
- 物品分类游戏html5,幼儿物品分类教案
- 《青春》 by 席慕容
- facenet 人脸识别原理理解(三)
- 【微信小程序/云开发bug解决方案合集】持续更新中(最新22-11-21)
- 华芯微特SWM32SRET6-50控制器应用记录
- [牛客网] 电话号码
- 【中文分词】 FMM BMM (python)
- LaTeX中的特殊字符
- 尚硅谷前端-京东左侧导航栏及网易新闻列表练习——CSS
- networkx整理
- java创建list指定长度_java List 按指定长度分割
- WebRTC VoiceEngine综合应用示例(一)——基本结构分析
- TCP连接数过大导致down机的原因分析
- 正则表达式系列(一):匹配开头与结尾