Alguna API de Hibernate para hacer queries en java que no me haga querer suicidarme?
Publicado por Agustin (170 intervenciones) el 03/03/2017 06:06:35
Hola. Soy nuevo en el foro. Entré aca porque no programo en java (y la verdad no me interesa para nada, pero las circunstancias me obligan), e hice esta misma pregunta en otro foro y no tuve ninguna respuesta satisfactoria.
Copio y pego el texto directamente para no tener que escribir todo de nuevo, porque es un poco largo:
Hola. Por cuestiones mas alla de mi control, estoy haciendo mantenimiento en un backend web hecho en java (algo que me juré a mi mismo que nunca iba a hacer, es tener que ensuciarme las manos tocando java, pero bueno, hay que pagar las cuentas)
Ahora bien, con NHibernate y C#, dada cualquier clase, por ejemplo:
puedo hacer esto:
Y NHibernate convierte la expresion x => x.Edad > 30 en SQL automaticamente, con la ventaja de que el codigo que escribo me lo verifica el compilador de C#, y lo tienen en cuenta las herramientas de refactor, renaming, etc. Con lo cual si llego a tipear "Edda" en lugar de "Edad" o algo por el estilo, el error lo detecto sin tener que ejecutar la aplicación. Además de esto, la expresión tiene que ser válida, es decir, el compilador me verifica que no use un tipo de datos inválido (por ejemplo string) para comparar contra un valor entero. Es decir, la expresión x => x.Edad > "Hola" no compila.
En lugar de eso, en este proyecto el codigo esta repleto de basura como esta:
|
Dejando de lado la repetición estúpida donde en 2 líneas de código aparece 4 veces el término "criteria", y dejando de lado el hecho que lo que quiero expresar realmente (buscar personas con edad > 30) se pierde por completo en todo ese ruido inútil, mi mayor problema es que "edad" es un string y si llego a cambiar el nombre de la propiedad en codigo, o tipear mal el compilador ni se entera, y tengo que ejecutar la aplicación para darme cuenta. Sin mencionar que el método Expression.ge() recibe un Object en lugar de un valor del tipo específico de la propiedad. Y por supuesto como la clase Criteria esa no es genérica (ya se, los generics de java no sirven para nada asi que no podría ser de otra forma), ni siquiera hay una forma de validad que "edad" sea una propiedad válida de la clase Persona.
Mis preguntas:
1 - Esta es la forma "moderna" en la que trabajan con bases de datos en java, EN 2017?
2 - ¿En serio? Traté de googlear y todos los ejemplos llevan a esto mismo, o a escribir el SQL en un string, que es todavia peor.
3 - Existe alguna alternativa, alguna API medianamente decente para hacer consultas con Hibernate, en java, que no me haga sentir como que estoy en 1999?
Desde ya agradezco la ayuda que me puedan dar para hacer más tolerable esta tortura.
Hasta ahi el texto original de mi pregunta. Ahora unos detalles adicionales:
1 - Se trata de un proyecto de un sistema web al que tengo que integrar un sistema mío, pero el cliente no tiene a ningun desarrollador java para hacer las modificaciones que se necesitan para integrar los 2 sistemas, con lo cual estoy obligado a hacer esto para poder venderle mi proyecto al cliente. Si ese no fuera el caso, seguiría intacto mi juramento que menciono arriba, por supuesto.
2 - En el otro foro básicamente me dieron 3 opciones, de las cuales ninguna me parece adecuada:
4 - Entiendo que java 8 incorporó finalmente expresiones lambda (10 años mas tarde que C#, e incluso un par de años más tarde que PHP), asi que, si bien entiendo que el soporte de java para este tipo de cosas es paupérrimo (comparado con C#/LINQ, cuyo fuerte en realidad está en las APIs de System.Linq.Expressions y la habilidad del compilador para convertir código ejecutable en árboles de expresiones modelados con esas APIs, algo de lo que java carece totalmente), espero que exista algo que al menos se parezca vagamente a lo que usamos en los lenguajes de programación modernos.
5 - En el otro foro me llamaron "fanboy de C#" por enumerar las falencias de java, que clara y objetivamente es un lenguaje inferior en todos los aspectos, y esto solamente es discutible si se encuentra una respuesta satisfactoria al punto 4. Espero no recibir el mismo tipo de comentarios subjetivos y ad-hominem acá. Si alguien no está de acuerdo con esta afirmación, que me demuestre UNA (1) característica del lenguaje java que no esté presente desde hace más de 10 años en C#, y en cualquier otro lenguaje moderno.
Como dije en el mensaje original:
Desde ya agradezco la ayuda que me puedan dar para hacer más tolerable esta tortura.
Copio y pego el texto directamente para no tener que escribir todo de nuevo, porque es un poco largo:
Hola. Por cuestiones mas alla de mi control, estoy haciendo mantenimiento en un backend web hecho en java (algo que me juré a mi mismo que nunca iba a hacer, es tener que ensuciarme las manos tocando java, pero bueno, hay que pagar las cuentas)
Ahora bien, con NHibernate y C#, dada cualquier clase, por ejemplo:
1
2
3
4
5
public class Persona
{
public string Nombre { get; set; }
public int Edad { get; set; }
}
puedo hacer esto:
1
2
3
4
5
6
ISession session = GetSession();
var mayoresDeEdad =
session.Query<Persona>()
.Where(x => x.Edad > 30)
.ToList();
Y NHibernate convierte la expresion x => x.Edad > 30 en SQL automaticamente, con la ventaja de que el codigo que escribo me lo verifica el compilador de C#, y lo tienen en cuenta las herramientas de refactor, renaming, etc. Con lo cual si llego a tipear "Edda" en lugar de "Edad" o algo por el estilo, el error lo detecto sin tener que ejecutar la aplicación. Además de esto, la expresión tiene que ser válida, es decir, el compilador me verifica que no use un tipo de datos inválido (por ejemplo string) para comparar contra un valor entero. Es decir, la expresión x => x.Edad > "Hola" no compila.
En lugar de eso, en este proyecto el codigo esta repleto de basura como esta:
|
1
2
3
Integer edad = new Integer(30);
Criteria criteria = session.createCriteria(Persona.class);
criteria.add(Expression.ge("edad", edad));
Dejando de lado la repetición estúpida donde en 2 líneas de código aparece 4 veces el término "criteria", y dejando de lado el hecho que lo que quiero expresar realmente (buscar personas con edad > 30) se pierde por completo en todo ese ruido inútil, mi mayor problema es que "edad" es un string y si llego a cambiar el nombre de la propiedad en codigo, o tipear mal el compilador ni se entera, y tengo que ejecutar la aplicación para darme cuenta. Sin mencionar que el método Expression.ge() recibe un Object en lugar de un valor del tipo específico de la propiedad. Y por supuesto como la clase Criteria esa no es genérica (ya se, los generics de java no sirven para nada asi que no podría ser de otra forma), ni siquiera hay una forma de validad que "edad" sea una propiedad válida de la clase Persona.
Mis preguntas:
1 - Esta es la forma "moderna" en la que trabajan con bases de datos en java, EN 2017?
2 - ¿En serio? Traté de googlear y todos los ejemplos llevan a esto mismo, o a escribir el SQL en un string, que es todavia peor.
3 - Existe alguna alternativa, alguna API medianamente decente para hacer consultas con Hibernate, en java, que no me haga sentir como que estoy en 1999?
Desde ya agradezco la ayuda que me puedan dar para hacer más tolerable esta tortura.
Hasta ahi el texto original de mi pregunta. Ahora unos detalles adicionales:
1 - Se trata de un proyecto de un sistema web al que tengo que integrar un sistema mío, pero el cliente no tiene a ningun desarrollador java para hacer las modificaciones que se necesitan para integrar los 2 sistemas, con lo cual estoy obligado a hacer esto para poder venderle mi proyecto al cliente. Si ese no fuera el caso, seguiría intacto mi juramento que menciono arriba, por supuesto.
2 - En el otro foro básicamente me dieron 3 opciones, de las cuales ninguna me parece adecuada:
1 - Hacerlo con Criteria (que tiene los problemas que menciono arriba)
2 - Hacerlo con HQL (que tiene los problemas que menciono arriba)
3 - Hacerlo con SQL puro (que me parece la peor solucion de todas)
Cualquiera de estas 3 soluciones requiere usar strings donde se debería usar código, algo que me parece pésimo, sobre todo teniendo en cuenta que estamos en 2017 y no en 1999, y estamos hablando de un lenguaje que supuestamente es estáticamente tipado. Usar strings para nombrar propiedades de clases (o peor, usar strings para definir comportamiento) deberia ser algo inaceptable.
2 - Hacerlo con HQL (que tiene los problemas que menciono arriba)
3 - Hacerlo con SQL puro (que me parece la peor solucion de todas)
Cualquiera de estas 3 soluciones requiere usar strings donde se debería usar código, algo que me parece pésimo, sobre todo teniendo en cuenta que estamos en 2017 y no en 1999, y estamos hablando de un lenguaje que supuestamente es estáticamente tipado. Usar strings para nombrar propiedades de clases (o peor, usar strings para definir comportamiento) deberia ser algo inaceptable.
4 - Entiendo que java 8 incorporó finalmente expresiones lambda (10 años mas tarde que C#, e incluso un par de años más tarde que PHP), asi que, si bien entiendo que el soporte de java para este tipo de cosas es paupérrimo (comparado con C#/LINQ, cuyo fuerte en realidad está en las APIs de System.Linq.Expressions y la habilidad del compilador para convertir código ejecutable en árboles de expresiones modelados con esas APIs, algo de lo que java carece totalmente), espero que exista algo que al menos se parezca vagamente a lo que usamos en los lenguajes de programación modernos.
5 - En el otro foro me llamaron "fanboy de C#" por enumerar las falencias de java, que clara y objetivamente es un lenguaje inferior en todos los aspectos, y esto solamente es discutible si se encuentra una respuesta satisfactoria al punto 4. Espero no recibir el mismo tipo de comentarios subjetivos y ad-hominem acá. Si alguien no está de acuerdo con esta afirmación, que me demuestre UNA (1) característica del lenguaje java que no esté presente desde hace más de 10 años en C#, y en cualquier otro lenguaje moderno.
Como dije en el mensaje original:
Desde ya agradezco la ayuda que me puedan dar para hacer más tolerable esta tortura.
Valora esta pregunta


-2