LINQ (Language Integrated Query) es un lenguaje de consulta bastante parecido a SQL pero cuyo propósito es realizar consultas sobre cualquier colección de datos, sin necesidad de que dicha colección tenga que estar almacenada en una base de datos relacional. Por ejemplo, permite realizar consultas sobre cualquier colección de elementos (una lista, un árbol...) o sobre un documento de XML. Si no me acuerdo mal, fue introducido en la versión 3.0 de C#.
JaQue es un proyecto opensource que ha desarrollado un porte de LINQ a Java, para ello se han basado en la propuesta de closures BGGA. Según el autor, la versión 1.5 de JaQue es una implementación completa de LINQ y cuenta con soporte para colecciones de datos, y XML. También hay una preview del soporte para JPA.
Para probarlo es necesario emplear la implementación de BBGA. La librería se distribuyen bajo la licencia GPL v3 y además de soportar el lenguaje de programación Java, también cuenta con interoperabilidad con Scala.
Creo que deberían trabajar un poco más en mostrar los puntos fuertes y los beneficios a través de ejemplos, por que mostrar:
----
Queryable orders = jem.from(Order.class);
System.out.println(count(where(new Predicate() {
public Boolean invoke(Order t) throws Throwable {
return t.getOrderID() > 11000;
}
}, orders))); //prints 77
----
como sustituto de
----
Query query = em.createQuery("SELECT COUNT(o.OrderID) FROM Order o where o.OrderID > 11000");
System.out.println("Count result:" + query.getSingleResult());
----
Le deja a uno con cara de... "¿perdon?". Y para ventajas de compilación, está al caer el JPA Criteria API.
Así que deberían mostrarlo más para lo que no existe alternativa, como trabajando con colecciones, y donde el equivalente JPA es menos eficiente. Si no la gente "no lo va a pillar".
My 2ec
Estoy de acuerdo con greeneyed. Además, si emplea la implementación de BGGA por qué para el predicado utiliza una clase anónima y no un closure?
Así sería mucho más claro (en sintáxis de C# porque no conozco bien la de BGGA):
var orders = GetOrders();
Console.WriteLine(orders.Count(order => order.OrderID > 11000));
Algo parecido es JDOQL por QueryDSL donde puedes poner un query como
Customer bob = query.from(customer).where(customer.firstName.eq("Bob")).uniqueResult(customer);
Escribe tu comentario