private static String getCountSql(String sql) {
return "select count(*) from "+cutOrderByOrGroupBy(getFromHql(sql));
} private static String cutOrderByOrGroupBy(String hql) {
int lastFromIndex = hql.lastIndexOf(" from ");
int lastOG = hql.lastIndexOf(" order by ");
if (lastOG < 0) {
lastOG = hql.lastIndexOf(" group by ");
}
if (lastFromIndex < lastOG) {
return hql.substring(0, lastOG);
}
return hql;
} private static String getFromHql(String sql) {
String tmpSql = sql;
int fIndex = tmpSql.indexOf(" from ");
tmpSql = tmpSql.substring(fIndex+5);
//确保from没被( 和 )包裹起来,即为该语句主from
if (!equalOpenAndCloseParenthesis(tmpSql)) {
tmpSql = getFromHql(tmpSql);
}
return tmpSql;
} private static Boolean equalOpenAndCloseParenthesis(String subSql) {
final Pattern opPattern = Pattern.compile("\\(");
final Matcher opMatch = opPattern.matcher(subSql);
final List<String> opMatches = new ArrayList<String>();
while (opMatch.find()) {
opMatches.add(opMatch.group(0));
}
final Pattern cpPattern = Pattern.compile("\\)");
final Matcher cpMatch = cpPattern.matcher(subSql);
final List<String> cpMatches = new ArrayList<String>();
while (cpMatch.find()) {
cpMatches.add(cpMatch.group(0));
}
return opMatches.size() == cpMatches.size();
}

根据from左右两侧括号情况判断某个from是否是主sql的from关键字。

SQL解析的更多相关文章

  1. 步步深入:MySQL架构总览->查询执行流程->SQL解析顺序

    前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来 ...

  2. Spark之SQL解析(源码阅读十)

    如何能更好的运用与监控sparkSQL?或许我们改更深层次的了解它深层次的原理是什么.之前总结的已经写了传统数据库与Spark的sql解析之间的差别.那么我们下来直切主题~ 如今的Spark已经支持多 ...

  3. 高大上技术之sql解析

    Question: 为何sql解析和高大上有关系?Answer:因为数据库永远都是系统的核心,CRUD如此深入码农的内心...如果能把CRUD改造成高大上技术,如此不是造福嘛... CRUD就是Cre ...

  4. sql 解析字符串添加到临时表中 sql存储过程in 参数输入

    sql 解析字符串添加到临时表中  sql存储过程in 参数输入 解决方法 把字符串解析 添加到 临时表中 SELECT * into #临时表   FROM dbo.Func_SplitOneCol ...

  5. oracle 内存结构 share pool sql解析的过程

    1.sql解析的过程 oracle首先将SQL文本转化为ASCII字符,然后根据hash函数计算其对应的hash值(hash_value).根据计算出的hash值到library cache中找到对应 ...

  6. 基于简单sql语句的sql解析原理及在大数据中的应用

    基于简单sql语句的sql解析原理及在大数据中的应用 李万鸿 老百姓呼吁打土豪分田地.共同富裕,总有一天会实现. 全面了解你所不知道的外星人和宇宙真想:http://pan.baidu.com/s/1 ...

  7. 自己实现一个SQL解析引擎

    自己实现一个SQL解析引擎 功能:将用户输入的SQL语句序列转换为一个可运行的操作序列,并返回查询的结果集. SQL的解析引擎包含查询编译与查询优化和查询的执行,主要包含3个步骤: 查询分析: 制定逻 ...

  8. [转]ORACLE SQL解析之硬解析和软解析

    http://blog.chinaunix.net/uid-25909722-id-3363789.html 当客户端进程,将SQL语句通过监听器发送到Oracle时, 会触发一个Server pro ...

  9. 关系型数据库工作原理-SQL解析(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...

  10. SQL解析在美团的应用

    https://tech.meituan.com/SQL_parser_used_in_mtdp.html 数据库作为核心的基础组件,是需要重点保护的对象.任何一个线上的不慎操作,都有可能给数据库带来 ...

随机推荐

  1. SpringMVC 实现文件上传与下载,并配置异常页面

    目录 上传文件的表单要求 Spring MVC实现上传文件 需要导入的jar包 配置MultipartResolver解析器 编写接收上传文件的控制器 Spring MVC实现文件下载 下载文件时的h ...

  2. 关于npm安装报错 网络问题等等等

    最近需要安装taro 结果网络各种报错 解决方法 : 1重置网络 npm config rm proxynpm config rm https-proxy 2换淘宝镜像 npm config set ...

  3. PHP加密解密函数(带有效期,过了有效期也解不了)

    转的,原来应该是discuz中弄的 <?php //加解密函数 //此函数的厉害之处在于可以在指定时间内加密还原字符串,超时无法还原. //这样我们就可以拿此函数来做很多用途了,比如:单点登录的 ...

  4. 汉诺塔I && II

    汉诺塔I 题目链接:https://www.nowcoder.com/questionTerminal/7d6cab7d435048c4b05251bf44e9f185 题目大意: 略 分析: 利用汉 ...

  5. js工具方法

    获取页面链接中的参数,以数组形式返回: function getParamsFromHref() { var parameters = window.location.search.substr(1) ...

  6. Manifest merger failed : Attribute application@icon value=(@mipmap/ic_launcher) from AndroidManifest

    情况是这样子的,导入一个比较老的项目(两年前),它依赖于一个 Libraray,已经先导入了 library,现在导入项目的时候出了错 (1) Android Studio 目前提供将 SDK包成 . ...

  7. hashChange & url change & QRCode & canvas to image

    hashChange & url change & QRCode & canvas to image "use strict"; /** * * @auth ...

  8. Spring-webflow基础讲解

    什么是webflow: Spring Web Flow构建于Spring MVC之上,允许实现Web应用程序的“流程”.流程封装了一系列步骤,指导用户执行某些业务任务.它跨越多个HTTP请求,具有状态 ...

  9. Fedora 24系统基本命令

    Fedora  24基本命令 一.     DNF软件管理 1.        修改配置:在/etc/dnf/dnf.conf中加入fastestmirror=true.keepcache=true ...

  10. Intel格式与Motorola格式的区别

      Intel低字节在前 Motorola高字节在前    在进行CAN总线通信设计或者测试过程中,经常看到CAN总线信号的编码格式有两种定义:Intel格式与Motorola格式.究竟两种编码格式有 ...