LINQ for Java工具

一个LINQ for java会成为一个有用的工具吗? 我一直在研究一个允许Java对象映射到数据库中的一行的工具。

  1. 这会对Java程序员有用吗?
  2. 什么function将是有用的?

LINQ for Java将是可爱的,但问题是语言集成。

Java没有像lambdaexpression式那样简洁的东西,而且它们是LINQ的基础之一。 我想他们可以在没有lambdaexpression式的情况下将查询expression式支持分层到普通的Java之上,通过使扩展创build匿名内部类 – 但是这将是相当可怕的。 如果你想做任何像LINQ to SQL的事情,你还需要expression式树。

检查exception可能会阻碍,但我们必须看到。 相当于IQueryable将需要某种常规检查exception – 或者可能在元素types和exceptiontypes中都是通用的…

无论如何,这一切都是在空中 – 考虑到Java社区在closures时遇到的麻烦,我认为在2012年之前期望Java本身就像LINQ一样是愚蠢的。当然,这并不是说在“类似Java”的语言中是不可能的。 例如,Groovy已经有了一些有用的方面。

对于库方面来说,Hibernate已经提供了LINQ to SQL的许多function的“非集成”版本。 对于LINQ to Objects,你应该看看Google Java Collections API – 这是很多相同的东西(过滤,投影等)。 没有lambdaexpression式,当然使用起来非常方便 – 但它仍然非常方便。 (我一直在工作中使用Google Collections代码,而且我讨厌回到“vanilla”Java集合中。)

值得注意的是, Scala 2.8将会有LINQ的支持 。


实际上,scala standart集合提供的API在某种意义上就像LINQ-for-Objects一样工作。 这是一个例子:

List("Paris","Berlin","London","Tokyo") .filter(c => c.endsWith("n")) .map(c => c.length) // result would be length of the words that ends // with "n" letter ("Berlin" and "London"). 

不要害怕新的点语法:你可以用普通的旧式编写代码:

 Array(1,2,3,4,5,6).map(x => x*x) 

还有一些项目提供了接近于LINQ-to-SQL的语法。 例如,来自Squeryll的片段:

 import Library._ using(session) { books.insert(new Author(1, "Michel","Folco")) val a = from(authors)(a=> where(a.lastName === "Folco") select(a)) } // but note that there is more code behind this example 

对于这个问题的更一般的方法,考虑使用Querydsl 。

它提供了一种支持JPA / Hibernate,JDO,SQL和Java Collection后端的LINQ风格的语法。

我是Querydsl的维护者,所以这个答案是有偏见的。

类似 AC#的解决scheme是JaQue 。 缺less的是特定领域的LINQ提供程序。

Hibernate使用HQL。 你可以做对象,但只能用于关系型数据库

提供LINQ到对象function的Java扩展是SBQL4J 。 它提供:

  • types安全在编译时
  • function比LINQ更强大的强大查询引擎
  • 与当前JVM的兼容性(它使用预处理将查询转换为纯Java代码)
  • 性能不错(运行时不使用reflection)
  • 清晰,精确的语义,没有不必要的,模糊的语法糖。

宝贝步骤:

第一种方法:使用expression式的string来实现Java LINQ,而不是lambda。

根据stringexpression式编写IQueryProviders

然后,在语言中直接追加stringexpression式。

但首先,我想要一个可以工作的LINQ:在语言中inputlinq,这是一件好事,但最重要的是:有办法编写IQueryProviders ,然后为POJO写一个提供程序,一个提供程序给Hibernate, SQL Server或Oracle等…

锡耶纳项目似乎不错。