java 复杂 sql_复杂的SQL条件

概述

什么是 Nutz.Dao 中的复杂SQL条件

对于 Nutz.Dao 来说,它本质上就是将你的 Java 对象转化成 SQL,然后交给 JDBC 去执行。

而 SQL 中,当执行数据删除和查询操作时,最常用的就是 WHERE 关键字。

WHERE 关键字后面的就是所谓的复杂查询条件

Nutz.Dao 将如何如何使用这个条件

Dao 接口的 clear 方法和 query 方法的第二个参数,就是为了生成 WHERE 后面那段字符串设计的

这个参数是一个 org.nutz.dao.Condition 接口的实现类

通过该接口的 toSql(org.nutz.dao.entity.Entity) 方法, Nutz.Dao 将获得 WHERE 后面那段字符串

当然也包括 ORDER BY

Condition 接口

这个接口只有一个方法toSql(Entity> entity)

这个方法带一个参数 org.nutz.dao.entity.Entity

通过这个参数,实现者可以获得当前需要操作的实体的配置信息

当然,如果你不需要的话,你可以不理睬这个参数

Nutz.Dao 会将toSql(Entity> entity) 的返回直接拼接到SQL 的 WHERE 关键字后面

如果你返回的字符串以 WHERE 或者 ORDER BY 开头,它会直接使用,否则会补上一个 WHERE 关键字

这个判断会忽略前后空白以及大小写

Nutz 给你的快速实现

如果你的数据库字段被假设不会发生变化,用直接硬编码是个很好的选择

如果在开发期,你的数据库字段变化非常频繁,用 Cnd 工具类则是更好的选择

一个友好的工具类 -- Cnd

有些情况,数据库中的字段同 Java 对象中的字段并不同名,

所以就需要给 Java 字段上的数据库字段注解加上参数 @Column("数据库字段名")

如果你通过 Cnd.wrap() 硬编码某个字段,那么当这个字段数据库字段名发生改变时,你就需要改动很多。

因此你希望仅仅将对于数据库的变动限制在 Java 对象的源文件里

所以 Nutz 提供了 Cnd.where() 方法

Condition c = Cnd.where("age",">",30).and("name", "LIKE", "%K%").asc("name").desc("id");

这个条件将生成 SQL

WHERE age>30 AND name LIKE '%K%' ORDERBY name ASC, id DESC

你也可以嵌套表达式

SqlExpressionGroup e1 = Cnd.exps("name", "LIKE", "P%").and("age", ">", "20");

SqlExpressionGroup e2 = Cnd.exps("name", "LIKE", "S%").and("age", "

Condition c = Cnd.where(e1).or(e2).asc("name");

这个条件将生成 SQL

WHERE (name LIKE 'P%' AND age>'20') OR (name LIKE 'S%' AND age

直接硬编码(不推荐)

最暴力的方法就是直接输出 WHERE 关键字后面的 SQL 代码了。比如查询一个 Person 对象

List crowd = dao.query(Person.class, Cnd.wrap("name LIKE 'J%' AND age>20"), null);

部分暴力,使用Static

// 筛选年龄(age)小于20,现金(cash字段)多于负债(due字段)的XX

List list = dao.query(Girl.class, Cnd.where("age", " due")));

拼装更加复杂的条件

上面的例子的 Cnd.where 函数,在大多数情况下可以快速的生成一个简单的查询条件。但是,如果查询条件非常复杂,

用它可能就比较费劲了。是的,它的设计初衷就是 "查询条件应该一行搞定"。

有些时候,查询条件很复杂,一行确实搞不定,怎么办?Nutz-1.b.38 以后,提供了 Criteria 接口,它继承自

Condition 接口,它的设计目的有两个:让程序员更容易的拼装复杂逻辑的条件

让生成的 SQL 可以被参数化,更好的支持 PreparedStatement

这个接口的使用也很简单,它基本符合 "IDE 的所见即所得" 接口设计原则。 就是说,如果你的 IDE 有智能提示的话,

你使用这个接口是不需要文档的。

// 创建一个 Criteria 接口实例

Criteria cri = Cnd.cri();

// 组装条件

if(...){

cri.where().andIn("id", 3,4,5).andIn("name", "Peter", "Wendal", "Juqkai");

}else if(...){

cri.where().andLT("id", 9);

}else if(...){

cri.where().andInBySql("关联字段","select id from 关联表 where name = '%s'",变量);

}else if(...){

cri.where().andInBySql("关联字段","select id from 关联表 where name like '%%%s%%'",变量);

}

if(...){

cri.where().andLike("name", "%A%");

}

cri.getOrderBy().asc("name").desc("id");

// 执行查询

List list = dao.query(MyObj.class, cri, null);

Criteria 的 where() 函数返回的是 SqlExpressionGroup,主要由它来提供各种 SQL 条件的组合方法。

这里需要给出一点提示,比如方法名 andGT,表示的是 andGreatThan,即

"大于" 的意思,同理:LT : 小于 (LessThan)

GTE : 大于等于 (GreatThanEqual)

LTE : 小于等于 (LessThanEqual)

模糊查询的小提示

如下代码,当str的长度大于1和等于1时的行为有差异

Cnd cnd = Cnd.where("name", "like", str);

// 若str的长度为1,输出的SQL是

// where name like "%a%"

// 若str的长度为2,输出的SQL是

// where name like "ab"

正确的写法是

Cnd cnd = Cnd.where("name", "like", "%" + str + "%s");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

找规律

找规律填写NN方阵。如N8时, 其方阵为: 1 1 1 1 1 1 1 11 2 2 2 2 2 2 11 2 3 3 3 3 2 11 2 3 4 4 3 2 11 2 3 4 4 3 2 11 2 3 3 3 3 2 11 2 2 2 2 2 2 11 1 1 1 1 1 1 1 上代码&#xff1a; 1 #include <stdio.h&g…

arm qt5 iconv 问题

2019独角兽企业重金招聘Python工程师标准>>> 问题 3&#xff1a;./system/rootlib/helloworld -qws &#xff0c;程序运行起来&#xff0c;仍报错 QIconvCodec::convertFromUnicode: using Latin-1 for conversion, iconv_open failed …

android java 调试快捷键_Android Studio 代码页跳界面 /java和XML快速切换技巧

从csdn博客搬家过来&#xff0c;请多关照&#xff01;之前一直在csdn博客,也写了不少关于java的文章,主要是学习java上的一些问题.想通过这种方式来加深对问题的认知,同时也可以帮助到志同道合的人,一起在编程的道路上共进,共勉.fancybox的配置项Fancybox的API和配置选项说明 属…

设计模式之Builder (创建者模式)的一些个人理解(转)

对于Builder模式很简单&#xff0c;但是一直想不明白为什么要这么设计&#xff0c;为什么要向builder要Product而不是向知道建造过程的Director要。刚才google到一篇文章&#xff0c;总算清楚了。在这里转贴一下这位richardluo的比喻。简单地说&#xff0c;就好象我要一座房子住…

python-多继承

python中的多继承python和C一样&#xff0c;支持多继承。概念虽然容易&#xff0c;但是困难的工作是如果子类调用一个自身没有定义的属性&#xff0c;它是按照何种顺序去到父类寻找呢&#xff0c;尤其是众多父类中有多个都包含该同名属性。class P1 #(object): def foo(self…

java父子表_Java编程:将具有父子关系的数据库表数据转换为树形结构,支持无限层级...

在平时的开发工作中&#xff0c;经常遇到这样一个场景&#xff0c;在数据库中存储了具有父子关系的数据&#xff0c;需要将这些数据以树形结构的形式在界面上进行展示。本文的目的是提供了一个通用的编程模型&#xff0c;解决将具有父子关系的数据转换成树形结构的问题。如有不…

[转]用Whois获得电信运营商的IP地址是如何分配的?

[转]用Whois获得电信运营商的IP地址是如何分配的? Linux下获得一些中国电信运营商的IP地址分配情况: APNIC是管理亚太地区IP地址分配的机构&#xff0c;它有着丰富准确的IP地址分配库&#xff0c;同时这些信息也是对外公开的&#xff0c;并提供了一个查询工具&#xff0c;下面…

BZOJ 2301 Problem b(莫比乌斯反演+分块优化)

题目链接&#xff1a;http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id37166 题意&#xff1a;对于给出的n个询问&#xff0c;每次求有多少个数对(x,y)&#xff0c;满足a≤x≤b&#xff0c;c≤y≤d&#xff0c;且gcd(x,y) k&#xff0c;gcd(x,y)函数为x和y的最大…

java importgeopoint_如何在地图上显示更多点(GeoPoint)?

目前&#xff0c;我能够在代码中显示第一个点(pointStatie)的一点&#xff0c;但我希望显示两个点。我想要显示我所在的位置&#xff0c;以及我从另一个班级通过坐标的另一点。我目前的代码是&#xff1a;package aexp.elistcbox;import android.os.Bundle;import android.prov…

Java实现串口通信的小样例

用Java实现串口通信&#xff08;windows系统下&#xff09;&#xff0c;须要用到sun提供的串口包 javacomm20-win32.zip。当中要用到三个文件&#xff0c;配置例如以下&#xff1a; 1.comm.jar放置到 JAVA_HOME/jre/lib/ext; 2.win32com.dll放置到 JAVA_HOME/bin; 3.javax.comm…

庆祝教师节,李宁老师课程优惠劵疯抢中、会员卡优惠中,先到先得

李宁老师会员卡&#xff08;9-10至9-14&#xff09;大优惠&#xff1a;http://edu.51cto.com/member/id-12_1.html优惠劵只能购买李宁老师的视频课程&#xff1a;http://edu.51cto.com/member/id-12_1.html 优惠劵有效期&#xff1a;2015-9-10 至 2015-9-14 购买规则&#xf…

java mset_Java 反射机制(包括组成、结构、示例说明等内容)

第1部分 Java 反射机制介绍Java 反射机制。通俗来讲呢&#xff0c;就是在运行状态中&#xff0c;我们可以根据“类的部分已经的信息”来还原“类的全部的信息”。这里“类的部分已经的信息”&#xff0c;可以是“类名”或“类的对象”等信息。“类的全部信息”就是指“类的属性…

XML序列化和反序列化 以及相关类的写法

类的写法&#xff1a; 省网办数据对接中运用到 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Serialization;namespace SWBExchange.Common.Entities {public class Body{[XmlElement(ElementName "BasicIn…

python-main

当你打开一个.py文件时,经常会在代码的最下面看到if __name__ __main__:,现在就来介 绍一下它的作用.模块是对象&#xff0c;并且所有的模块都有一个内置属性 __name__。一个模块的 __name__ 的值取决于您如何应用模块。如果 import 一个模块&#xff0c;那么模块__name__ 的值…

自己动手,实现一种类似ListT的数据结构(二)

前言&#xff1a; 首先&#xff0c;小匹夫要祝各位看官圣诞快乐&#xff0c;新年愉快&#xff5e;。上一篇文章《自己动手&#xff0c;实现一种类似List<T>的数据结构(一&#xff09;》 介绍了一下不依靠List<T>实现的各种接口&#xff0c;仿造一个轻量级数据结构的…

java spring jdbc_Spring与JDBC支持

JDBC是一种标准Java编程接口(JAVA API)&#xff0c;可以将Java编程语言与广泛数据库进行连接。JDBC API库包含下面提到的每个任务&#xff0c;都是与数据库相关的常用用法。数据库的连接创建sql语句执行或提交sql语句查看或修改查询到的记录从根本上说&#xff0c;JDBC是一种规…

局域网内连接MySQL

2019独角兽企业重金招聘Python工程师标准>>> 局域网内连接MySQL 博客分类&#xff1a; MySQL MySQL局域网连接grant 我们都知道连接MySQL一般用的语句就是 jdbc:mysql://localhost:3306/database&#xff0c; 但是当你要连接到其他机器上的mysql的时候&#xff0c;…

java打印的globa类l_Spring异常集中处理和日志集中打印

使用ControllerAdvice和ExceptionHandler处理Controller层的异常&#xff1a;ControllerAdvicepublic class GlobalExceptionHandler {private static final Logger LOGGER LoggerFactory.getLogger(GlobalExceptionHandler.class);/*** 处理所有不可知的异常* param e* retur…

[leetcod] Clone Graph

题目&#xff1a; Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJs undirected graph serialization: Nodes are labeled uniquely. We use # as a separator for each node, and , as a separator for node label and …

【iOS7一些总结】9、与列表显示(在):列表显示UITableView

列表显示&#xff0c;顾名思义它是在一个列表视图的形式显示在屏幕上的数据的内容。于ios在列表视图UITableView达到。这个类在实际应用中频繁&#xff0c;是很easy理解。这里将UITableView的主要使用方法总结一下以备查。UITableView定义在头文件UITableView.h中&#xff0c;详…