Ver Mensaje Individual
  #1 (permalink)  
Antiguo 28/02/2017, 08:36
agleiva
(Desactivado)
 
Fecha de Ingreso: enero-2015
Mensajes: 393
Antigüedad: 9 años, 9 meses
Puntos: 52
Alguna API de Hibernate para hacer queries en java que no me haga querer suicidarme?

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:

Código C#:
Ver original
  1. public class Persona
  2. {
  3.     public string Nombre {get; set; }
  4.     public int Edad {get; set; }
  5. }

puedo hacer esto:

Código C#:
Ver original
  1. ISession session = GetSession();
  2.  
  3. var mayoresDeEdad =
  4.     session.Query<Persona>()
  5.            .Where(x => x.Edad > 30)
  6.            .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:

Código Java:
Ver original
  1. Integer edad = new Integer(30);
  2. Criteria criteria = session.createCriteria(Persona.class);
  3. 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.

Última edición por agleiva; 28/02/2017 a las 08:56