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 \u0026gt; 3000000`

\\

假设采用典型的映射和配置,同等功能的查询使用Hibernate会如下所示:

\\

\`List = session.createQuery(\"SELECT country.name \" +\        \"FROM country JOIN city \" +\        \"WHERE city.population \u0026gt; 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 -\u0026gt; c.getCountry().getCapital().equals(c)\                \u0026amp;\u0026amp; c.getPopulation() \u0026gt; 3000000)\        .select(c -\u0026gt; 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

通过Jinq简化数据库查询相关推荐

  1. .NET:使用 LinqSharp 简化复杂查询

    LinqSharp 是个开源 LINQ 扩展库,它允许您编写简单代码来生成复杂查询,包括查询扩展和动态查询生成. LinqSharp.EFCore 是对 EntityFramework 的增强库,提供 ...

  2. 利用C#实现分布式数据库查询

    随着传统的数据库.计算机网络和数字通信技术的飞速发展,以数据分布存储和分布处理为主要特征的分布式数据库系统的研究和开发越来越受到人们的关注.但由于其开发较为复杂,在一定程度上制约了它的发展.基于此,本 ...

  3. MongoDB数据库查询性能提高40倍

    MongoDB数据库查询性能提高40倍 大家在使用 MongoDB 的时候有没有碰到过性能问题呢?下面这篇文章主要给大家分享了MongoDB数据库查询性能提高40倍的经历,需要的朋友可以参考借鉴,下面 ...

  4. mongodb 搜索速度_MongoDB数据库查询性能提高40倍的经历分享

    前言 数据库性能对软件整体性能有着至关重要的影响,本文给大家分享了一次MongoDB数据库查询性能提高40倍的经历,感兴趣的朋友们可以参考学习. 背景说明 1.数据库:MongoDB 2.数据集: A ...

  5. 教你用一条SQL搞定跨数据库查询难题

    导读 日前,某电商用户由于业务发展迅猛,访问量极速增长,导致数据库容量及性能遭遇瓶颈.为降低数据库大小,提升性能,用户决定对架构进行垂直拆分.根据不同的表来进行拆分,对应用程序的影响也更小,拆分规则也 ...

  6. 数据库-使用Command对象进行数据库查询

    在ADO.NET中使用Command对象来与数据库进行查询. 一.创建Command对象 有三种方式创建Command对象: 1.7         第一种使用New关键字,调用Command对象的无 ...

  7. Oracle数据库查询十个小技巧

    数据查询,是数据库操作中最主要的功能之一:有时候数据库查询性能的好坏,直接关系到数据库的运行效率,关系到数据库的选型.下面笔者不谈大道理,只是对其中对一些平时大家容易忽略的查询小技巧做一些总结.或许大 ...

  8. 提高数据库查询效率的八个方法

    当用户在一张大表中采用这个LIKE语句的话,就会发现这个查询语句的运行效率非常的慢.这是什么原因造成的呢?其实,不管是Like 关键字,若采用MATCHES关键字的话,若在大量数据中查找符合条件的记录 ...

  9. 优化Oracle数据库查询10个方法

    优化Oracle数据库查询10个方法: 网页制作中数据的查询是最主要的功能之一,其性能的好坏直接关系到网页的的运行效率.下面对Oracle数据库中大家不太注意的查询方法做一些总结. 第一个方法:利用连 ...

最新文章

  1. vijos - P1279Leave-绿光(数学归纳法 + python)
  2. 学习笔记~~~~~Set接口实现
  3. 英特尔扶正临时CEO 打破公司50年CEO选拔传统
  4. HTML5:一个拖拽网页元素的例子
  5. paip.FTP服务端及客户端的使用总结
  6. 小程序毕设作品之微信酒店预订小程序毕业设计(1)开发概要
  7. android 开源fc模拟器_用 Go 撸了一个 NES/FC/红白机模拟器——GoNES
  8. Microsoft .NET Framework 4 安装 1603错误的解决
  9. TryJquery- 14个jquery视频
  10. PHP开发工具phpDesigner 7 (最新版,含注册机)
  11. ImportError: DLL load failed while importing shell: 找不到指定的模块。
  12. 计算机老掉线 路由器网络,路由器经常掉线怎么办 路由器WIFI信号不稳定解决方法...
  13. 搜狗浏览器屏蔽广告插件_搜狗浏览器屏蔽芒果TV视频广告:被判不正当竞争,赔了12万...
  14. 【JS】1126- 如何更好的取消一个promise?
  15. java老师和学生(java老师学生类合集)
  16. Facenet 原理介绍
  17. 工程项目失败案例_失败工程
  18. EDU教育版Office365使用教程(二):桌面版Office365下载安装
  19. 迷人和漂亮的十几岁的明星
  20. 追女生要经过哪几个阶段?告诉你追女生经历的具体阶段!

热门文章

  1. GitHub 使用教程图文详解(转)
  2. 离开,是一个新的开始
  3. Chapter 1: 使用引用类型
  4. python 多态 锁_python 上下文管理器,多态,数据锁定与自省,
  5. windows下python 自动截图功能
  6. 樊登36个问题建立亲密关系_36个问题建立亲密关系
  7. 系统动力学建模工具_多体动力学:ANSYS Motion 2020R2
  8. android字体等宽,Android等宽字体大小
  9. linux日志打印规则,Linux 打印简单日志(一)
  10. python assert_Python中何时使用断言 assert