Java - Alguna API de Hibernate para hacer queries en java que no me haga querer suicidarme?

 
Vista:
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

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:

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.

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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
-2
Responder

Alguna API de Hibernate para hacer queries en java que no me haga querer suicidarme?

Publicado por Zero Vida (1 intervención) el 03/03/2017 14:52:27
Hola.

Entiendo tu frustración ante algo que desconoces y no te agrada.
Pero debes entender que todos los lenguajes de programación tienen lados fuertes y débiles.
LINQ de C# es muy agradable para hacer consultas a distintas fuentes de datos: objetos, xmls, bases de datos y etc...
Pero Java no es C#; así cualquier programador alguna vez en su vida va a tener que ocupar otro lenguaje de programación por necesidad; uno se debe tener la manera de ingeniárselas, para sacar a flote el desarrollo con un buen funcionamiento.

La ventaja de C# sobre Java es la forma en que le están aplicando características nuevas y esto les hace la vida mucho más fácil a sus adeptos y simpatizantes.

Lamentablemente tienes que tocar el lenguaje Java; !porque es el más utilizado en todos lados!, más en el lado Cliente/Servidor, moviles, etc...

Nosotros los que ocupamos Java no tenemos tan fácil la vida para hacer las cosas con tres o dos lineas de código, no tenemos un empresa que se dedique a darle nuevas herramientas tan novedosas como se las da microsoft a sus lenguajes.

Por lo que te recomiendo que si puedes quédate en tu lenguaje que te hace más fácil tu vida y no busques hacer algo que no te agrada, ni tienes las ganas de aprender, ya sea que se te haga muy simple o complejo o tonto.

Si tienes ganas de aprender busca la interpolaridad de C# con JavaEE. Así solo programas en C# y listo, problema resuelto.
Así estarás a la vanguardia en pleno 2017!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 190
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Alguna API de Hibernate para hacer queries en java que no me haga querer suicidarme?

Publicado por preguntas (70 intervenciones) el 03/03/2017 16:32:19
Jaja tranquilo amigo, como te dijeron. Todos los lenguajes tienen sus altas y bajas.

Para mi hibernate es una de las mejores apis, pero allá yo.

Para empezar a comprender todo esto de la persistencia y cuanto enrredo que aunque te hacen escribir 100 lineas menos (es lo bueno), es un poco mas complejo de entender (es lo malo). Te recomiendo JPA, la Java Persistence Api.

Aquí solo haces un par de configuraciones para conectar a la base de datos y luego la Api literalmente hace magia.
Mejor aun que el SQL estandar, utiliza JPQL otra maravilla de Java.

Googlea un poco de lo que digo, notaras una diferencia razonable.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Alguna API de Hibernate para hacer queries en java que no me haga querer suicidarme?

Publicado por Agustin (170 intervenciones) el 05/03/2017 00:22:45
Todos los lenguajes tienen sus altas y bajas

Si, lastima que java tiene todas las bajas y ninguna alta.

Para mi hibernate es una de las mejores apis, pero allá yo.

"mejor"? Comparado con que? con Cobol? seguro. Con cualquier lenguaje moderno? Ni se acerca.

Para empezar a comprender todo esto de la persistencia

No necesito "emprezar a comprender" nada. Solo necesito una API moderna, pero es evidente que estoy pidiendo demasiado, tratándose de java.

la Api literalmente hace magia

Yo no veo que haga ninguna "magia". Lo unico que veo es un asco de API que requiere usar strings para generar las consultas, en lugar de tener un modelo estático. Para un programador java que vive en 1999, esto puede parecer "magia", pero el resto del mundo estamos en 2017, y la verdad tener que usar strings parece un chiste.

notaras una diferencia razonable

Honestamente no veo la diferencia:

- Hibernate: strings para las consultas
- JPA: strings para las consultas

Donde esta la diferencia?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-2
Comentar