关于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相关推荐

  1. hibernate: 用Disjunction和Conjunction构造复杂的查询条件

    Disjunction 与 Conjunction 表示逻辑或与逻辑与 可以构造复杂的Sql 语句 Disjunction disjunction = Restrictions.disjunction ...

  2. HIBERNATE:disjunction和conjunction构造复杂的查询条件.

    工作中小结:(1) 查询某个批次的数据,也还可以输入州/县/医疗机构(这三个是或者的关系)://disjunction或者 关系:[ 批次的数据  &&  (州   ||  县   | ...

  3. hibernate 管理 Session(单独使用session,非spring)

    hibernate 管理 Session(单独使用session,非spring) Hibernate 自身提供了三种管理 Session 对象的方法 Session 对象的生命周期与本地线程绑定 S ...

  4. (3) Hibernate的查询 标准(Criteria)查询

    Hibernate的查询 标准(Criteria)查询 1 一个简单例子: Java代码   @SuppressWarnings("unchecked") public void ...

  5. Hibernate:DisjunctionConjunction构造复杂的查询条件

    HIBERNATE:DISJUNCTION&CONJUNCTION构造复杂的查询条件. Hibernate:Disjunction&Conjunction构造复杂的查询条件 Disju ...

  6. Hibernate:DisjunctionConjunction构造复杂的查询条件.

    Hibernate:Disjunction&Conjunction构造复杂的查询条件 Disjunction和Conjunction是逻辑或和逻辑与,如下: 用来组合一组逻辑或[or]条件的方 ...

  7. Knowledge 3命题逻辑形式推演(resolution归结原理- -- 1条规则)

    目录 一.写在前面 二.resolution归结原理 2.1 什么是resolution归结原理 2.2 怎么将一个任何一个式子改写成CNF合取范式的形式 2.3  利用归结原理和反证法证明      ...

  8. 人工智能 归结原理实验报告

    归结原理实验 一.实验目的 加深学生对归结原理进行定理证明过程的理解,掌握基于谓词逻辑的归 结过程中子句变换过程.替换与合一算法即归结策略等重要环节,进一步了解实 现机器自动定理证明的步骤. 二.实验 ...

  9. 人工智能归结原理实验

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.流程 二.步骤 0.声明 1.消去蕴含词和等值词 2.使否定词仅作用于原子公式 3.使量词间不含同名指导变元 4. ...

最新文章

  1. 如何在Laravel 中对大文件进行加密?
  2. Go 语言编程 — 高级数据类型 — Slice 切片
  3. JAVA基础知识要点
  4. CentOS 7 搭建JAVA环境
  5. 这可不是一般的便宜哦!
  6. 谈谈软件工程与计算机科学的区别
  7. 物品分类游戏html5,幼儿物品分类教案
  8. 《青春》 by 席慕容
  9. facenet 人脸识别原理理解(三)
  10. 【微信小程序/云开发bug解决方案合集】持续更新中(最新22-11-21)
  11. 华芯微特SWM32SRET6-50控制器应用记录
  12. [牛客网] 电话号码
  13. 【中文分词】 FMM BMM (python)
  14. LaTeX中的特殊字符
  15. 尚硅谷前端-京东左侧导航栏及网易新闻列表练习——CSS
  16. networkx整理
  17. java创建list指定长度_java List 按指定长度分割
  18. WebRTC VoiceEngine综合应用示例(一)——基本结构分析
  19. TCP连接数过大导致down机的原因分析
  20. 正则表达式系列(一):匹配开头与结尾

热门文章

  1. nock模拟服务响应_使用Node.js nock拦截HTTP请求
  2. 计算机科学与技术单身率,中国大陆男女比例揭晓!大学单身率专业十强来了
  3. cobbler集成服务器批量安装操作系统(无人值守)
  4. 自动切换手机耳机模式和话筒模式
  5. 关于仿写00片刻企业站
  6. 普通路由器改4g路由器_4G工业路由器将加速工业物联网发展进程
  7. 顶点计划6-4小组调研报告
  8. Mysql开启3306端口远程访问
  9. 神书《纳瓦尔宝典:财富和幸福指南》说了些什么
  10. bubbles html5游戏源码,html5 canvas弹性气泡爆破 | 撒花动画