Herramienta LINQ para Java
sql mysql (8)
¿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.
- ¿Sería esto útil para los programadores de Java?
- ¿Qué características serían útiles?
LINQ para Java sería encantador, pero el problema es la integración del lenguaje.
Java no tiene nada más conciso que las expresiones lambda, y son una de las bases de LINQ. Supongo que podrían superponer el soporte de la expresión de consulta sobre Java normal sin expresiones lambda, al hacer que la expansión creara 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 comprobadas pueden ser un obstáculo, 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 pay-in-the-sky: dados los problemas que la comunidad Java está teniendo con los cierres, creo que sería una locura esperar algo así como LINQ en Java antes de 2012. Por supuesto, eso no quiere decir no sería posible en un lenguaje "similar a Java". 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 funciones de LINQ to SQL. Para LINQ to Objects, debe consultar la API de Google Java Collections , es una gran cantidad 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 "vanas" de Java).
La solución similar a AC # es JaQue . Lo que falta son los proveedores de LINQ específicos del dominio.
Para un enfoque más general del problema, considere usar 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.
Pequeños pasos:
Un primer enfoque: implementar Java LINQ utilizando cadenas para expresiones, en lugar de lambda.
Escriba IQueryProviders
basado en expresiones de cadena.
Luego, busque agregar las expresiones de cadena directamente en el idioma.
Pero primero, quiero un LINQ que funcione: escriba linq en el lenguaje, es algo bueno, pero el punto principal es: tener una forma de escribir IQueryProviders
, luego, escribir un proveedor para POJO , un proveedor para Hibernate, un proveedor para SQL Server u Oracle, etc.
Una extensión a Java que proporciona capacidades de LINQ a objetos es SBQL4J . Ofrece:
- Tipo de seguridad en tiempo de compilación
- Potente motor de consultas con mayores capacidades que LINQ
- Compatibilidad con las JVM actuales (utiliza preprocesamiento para traducir consultas a código Java puro)
- Buen rendimiento (no se usa reflexión en tiempo de ejecución)
- Semántica clara y precisa sin azúcar sintáctico innecesario y oscuro.
Vale la pena señalar que Scala 2.8 tendrá soporte LINQ ...
En realidad, las colecciones stalart Scala proporcionan API que funciona como LINQ-for-Objects 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 tengas miedo a la sintaxis de línea nueva: puedes escribir código en un estilo simple:
Array(1,2,3,4,5,6).map(x => x*x)
Y hay una serie de proyectos que proporcionan una sintaxis LINQ-to-SQL cercana. Por ejemplo, fragmento 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
Hibernate usa HQL. Puedes hacer Object pero solo para bases de datos relacionales