点击围观!腾讯 TAPD 助力金融行业研发提效、敏捷转型最佳实践! 了解详情
写点什么

通过 Jinq 简化数据库查询

  • 2016-03-23
  • 本文字数:1402 字

    阅读完需:约 5 分钟

Jinq 库为数据库查询提供了一个 DSL,可以用于Java 和Scala 。这个项目的灵感来源于.NET 的LINQ,致力于提供易于编写的查询,同时支持类型安全。据这个工具的创建者Ming-Yee Iu 介绍, Jinq 起步于 2006 年,当时的名称为 Queryll,但是直到采用了 Java 8 的 lambdas,才完全发挥出了它的潜力。

跟其他已有的库不同,Jinq 并无意提供完整的数据访问功能:Jinq 只是一个查询工具,因此用于从数据库中获取数据。数据操作,不管是插入、修改还是删除,都依然需要开发人员采用其他的机制。基于这个原因,Jinq 提供了与其他最流行的数据库访问库联合使用的支持,包括所有兼容JPA 的模式(如Hibernate 或EclipseLink)与 jOOQ

鉴于它不能作为已有库的替代品,有些用户可能就会怀疑 Jinq 所带来的附加价值是什么。为了尝试并展现它的价值何在,我们用不同的工具来对比一个相同的查询。

我们考虑一个由世界各个国家和城市所组成的数据库。假设我们需要获取首都人口在 300 万以上的国家列表。对应的 SQL 查询会如下所示:

SELECT country.name FROM country JOIN city ON country.capital_id = city.id WHERE city.population > 3000000假设采用典型的映射和配置,同等功能的查询使用 Hibernate 会如下所示:

List = session.createQuery("SELECT country.name " + "FROM country JOIN city " + "WHERE city.population > 3000000") .list();
我们可以看到,HQL 能够消除掉一些查询中的复杂性,但它依然还是在一个字符串之中,这意味着它可能会包含一些潜在的错误,而这些错误只能在运行期才能发现。接下来看一下,如果使用 jOOQ 的话,该怎样编写这个查询:

Result result = create.select(COUNTRY.NAME) .from(COUNTRY) .join(CITY).on(COUNTRY.CAPITAL_ID.equal(CITY.ID)) .where(CITY.POPULATION.gt(3000000)) .fetch(); 这给程序员提供了一种更高级别的类型安全性,引用错误的域、表或操作将会导致编译错误。但是,这个代码依然不够流畅。最后,我们来看一下使用 Jinq 的函数式方法该如何编写这个查询:

List = streams.streamAll(em, City.class) .where(c -> c.getCountry().getCapital().equals(c) && c.getPopulation() > 3000000) .select(c -> c.getCountry().getName()) .toList();
这个代码非常类似于开发人员使用流数据时所创建的典型结构,这允许他们在编码的时候,保持一种函数式的编程风格。在内部,尽管它看起来像是使用流,但 Jinq 会使用一种名为“符号执行(symbolic execution)”的技术,将上述的代码转换为实际的 SQL 查询,而这些 SQL 查询,数据库是能够进行优化的。

在字节码级别,当到达这块代码的时候,Jinq 并不会直接执行。Jinq 将会检查不同的步骤,并计算这些步骤会给传入数据所带来的副作用,这就是所谓的符号执行。一旦这些组合的副作用计算完毕,它就会转换为同等作用的 SQL 查询。如果所计算的副作用对于 Jinq 来说过于复杂,无法转换为 SQL,那么它会作为正常的 Java 代码来执行,这意味着会得到相同的结果,但是性能可能会稍差一些。

在 Java 开发社区,一直想要有一个能够与.NET 的 LINQ 功能对等的 Java 实现。由于语言设计的限制,这可能永远无法完全实现:像 C#这样的.NET 语言实现,在定义级别进行了修正,以便于让 LINQ 集成到语言之中,在这方面,Java 的架构师是一直反对的。基于该原因,Jinq 可能是最为接近的类似方案了。

查看英文原文: Simplifying Database Queries with Jinq

2016-03-23 19:009091

评论

发布
暂无评论
发现更多内容

企业选择局域网即时通讯软件的必要性是什么?

WorkPlus

TiDB Hackathon 2022丨总奖金池超 35 万!邀你唤醒代码世界的更多可能性!

PingCAP

#TiDB

Chrome操作指南——入门篇(十二)color picker(颜色选择器)

Augus

Chrome开发者工具 9月月更

测试驱动开发 (TDD) 在线练功房 | 12 月 17 日开课

ShineScrum捷行

CAT 认证敏捷团队教练工作坊 (Coaching Agile Teams) | 2023年1月 7 日开课

ShineScrum捷行

敏捷教练 专业教练

我所知道的webpack5那些不太一样的改变

Java-fenn

Java

最全Java面试攻略,吃透25个技术栈Offer拿到手软

Java-fenn

Java 编程 程序员 java面试 Java面试题

Github最新Java面试1658核心讲,助力百人入大厂!

Java-fenn

Java 编程 程序员 java面试 Java面试题

聚焦金融行业未来,博睿数据亮相第五届中国银行CIO峰会

博睿数据

AIOPS 金融 银行 博睿数据 ONE平台

通过 Kasten K10 by Veeam 与 SUSE Rancher 实现云原生应用灾备迁移

Java-fenn

Java

SelectDB 创始人兼 CEO 连林江荣获 OSCAR 开源产业大会「尖峰开源人物 」奖项

SelectDB

数据库 大数据 数据仓库 企业号九月金秋榜 尖峰开源

优化帮助中心需要做到以下几点

Baklib

产品 帮助中心 在线设计

华为云GaussDB——打造金融行业坚实数据底座,共创数字金融新未来

Java-fenn

Java

牛客网趋势最热Java八股文,速度赶紧马上打包带走!

Java-fenn

Java 编程 程序员 java面试 Java面试题

金九银十必备!这份java面经让你轻松拿下45kOffer

Java-fenn

Java 程序员 面试 java面试 Java面试题

安利一个比Gitbook更好用的国内帮助文档制作平台

Baklib

J神出品!让 Compose 从此摆脱 ViewModel

Java-fenn

Java java;

【9.16-9.23】写作社区精彩技术博文回顾

InfoQ写作社区官方

优质创作周报

电商黄牛,你被小红书盯上了

小红书技术REDtech

算法 电商风控 黄牛治理

前端必读3.0:如何在 Angular 中使用SpreadJS实现导入和导出 Excel 文件

葡萄城技术团队

Kong重构了其事件通知机制

八苦-瞿昙

Event Gateway API Gateway

当你 git push 时,极狐GitLab上发生了什么?

极狐GitLab

DevOps gitlab SSH gitops 极狐GitLab

数据湖系列之二 | 打造无限扩展的云存储系统,元数据存储底座的设计和实践

Baidu AICLOUD

数据湖 元数据

2022年震荡与加速中前行的新消费

易观分析

疫情 消费

2021年中国自然语言处理软件及服务市场规模超200亿,市场保持高速增长,竞争格局远未稳定

易观分析

自然语言处理 市场

《软件开发的201个原则》思考:6. 低可靠性比低效率更糟糕

非晓为骁

个人成长 软件工程能力 高质量

WorkPlus移动办公系统:打造安全专属、统一业务与运营的企业门户

WorkPlus

Chrome操作指南——入门篇(十一)network

Augus

Chrome开发者工具 9月月更

MyBatis批量插入几千条数据慎用foreach

Java-fenn

Java

疫情时代下,线上协同办公成时下热点

Baklib

远程办公 企业 协同办公 在线设计

通过Jinq简化数据库查询_Java_Abraham Marín Pérez_InfoQ精选文章