2008-12-06 14 views
40

¿Sería un LINQ para java una herramienta útil? He estado trabajando en una herramienta que permitirá que un objeto Java se asigne a una fila en una base de datos.Herramienta de LINQ para Java

  1. ¿Sería esto útil para los programadores Java ?
  2. ¿Qué características serían útil?
+3

Para LINQ a los objetos, consulte este: github.com/nicholas22/jpropel-light, ejemplo real: new String [] {"james", "john", "john", "eddie"} .where (startsWith ("j")). toList(). distinct(); –

+0

Scala LINQ: https://github.com/nicholas22/propelS – Scooterville

Respuesta

63

LINQ para Java sería encantador, pero el problema es la integración de idiomas.

Java no tiene nada tan conciso como expresiones lambda, y son uno de los cimientos de LINQ. Supongo que podría superponer el soporte de expresión de consulta sobre Java normal sin expresiones lambda, haciendo que la expansión cree clases internas anónimas, pero sería bastante horrible. También necesitaría árboles de expresión si quisiera hacer algo como LINQ to SQL.

Las excepciones registradas podrían ponerse en medio, pero tendríamos que ver. El equivalente de IQueryable necesitaría tener algún tipo de excepción comprobada general, o posiblemente podría ser genérica tanto en el tipo de elemento como en el tipo de excepción ...

De todos modos, esto es todo en el cielo - dados los problemas que la comunidad Java está teniendo con los cierres, creo que sería una locura esperar algo como LINQ en Java antes de 2012. Por supuesto, eso no quiere decir que no sería posible en un "estilo Java" idioma. Groovy ya tiene ciertos aspectos útiles, por ejemplo.

Para el lado de la biblioteca, Hibernate ya ofrece una versión "no integrada" de muchas de las características de LINQ to SQL. Para LINQ to Objects, debe mirar el Google Java Collections API - es mucho del mismo tipo de cosas (filtrar, proyectar, etc.). Sin lambdas es mucho más difícil de usar, por supuesto, pero aún así es realmente útil. (Utilizo el código Google Collections todo el tiempo en el trabajo, y me gustaría volver a las colecciones Java "vainilla")

+0

¿Qué problemas está experimentando la comunidad java con los cierres? – Claudiu

+3

@Claudiu: Varias propuestas, ninguna de ellas totalmente satisfactoria. Lo último que escuché es que es poco probable que llegue a Java 7, debido a la gran cantidad de discusiones. Esta es una desventaja de que Java es tan democrático. –

+0

¿Dónde hay un ejemplo de Proyección en la API de Google Api? –

1

Hibernate utiliza HQL. Usted puede hacer objetos, sino sólo para bases de datos relacionales

14

Vale la pena señalar que Scala 2.8 is going to have LINQ support ...


En realidad, colecciones Scala standart proporcionan API que funciona como LINQ fines de objetos en algún sentido. Aquí está el ejemplo:

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"). 

no hay que asustarse de la nueva línea de puntos sintaxis: puede escribir código en la llanura viejo estilo:

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

y hay una serie de proyectos que proporcionan cerca de la sintaxis LINQ-to-SQL. Por ejemplo, snippet tomado de 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 
+0

Parece que todavía no, pero aquí está la esperanza. Scala ha hecho grandes hazañas antes, como la integración de XML en el lenguaje. Y espero que mejore :) –

8

Para un enfoque más general al problema, considere el uso de Querydsl.

Proporciona una sintaxis de estilo LINQ con soporte para backends JPA/Hibernate, JDO, SQL y Java Collection.

Soy el mantenedor de Querydsl, por lo que esta respuesta es parcial.

4

Una solución tipo C# es JaQue. Lo que falta son los proveedores de LINQ específicos del dominio.

0

Una extensión a Java que proporciona capacidades de LINQ a objetos es SBQL4J. Ofrece:

  • seguridad de tipos en tiempo de compilación
  • motor de consulta de gran alcance con mayores capacidades que LINQ
  • Compatibilidad con JVM actuales (que utiliza preprocesamiento para traducir las consultas a código Java puro)
  • Niza rendimiento (no se utiliza ninguna reflexión en el tiempo de ejecución)
  • Semántica clara y precisa sin azúcar sintáctico innecesario y oscuro.
0

pasos del bebé:

Una primera aproximación: implementar Java LINQ el uso de cadenas para las expresiones, en lugar de lambda.

Escriba IQueryProviders en base a expresiones de cadena.

A continuación, busque agregar las expresiones de cadena directamente en el idioma.

Pero primero, quiero un LINQ que funciona: LINQ escrito en el lenguaje, que es una cosa buena, pero el punto principal es: tiene una manera de escribir IQueryProviders, a continuación, escribir un proveedor de POJO s, un proveedor de Hibernate , un proveedor para SQL Server u Oracle, etc ...

0

Siena proyecto parece bueno.

Cuestiones relacionadas