Considere un servicio de solo lectura que necesita realizar una búsqueda en tiempo real de una base de datos de respaldo. El servicio debe ser capaz de generar consultas de selección bastante complejas para generar resúmenes, informes y resultados basados en objetos de varias tablas. Las prioridades para la selección de biblioteca/marco son rendimiento (de sql), mantenibilidad y longevidad.Comparaciones de bibliotecas para SQL dinámico en Java
Hibernate - parece requerir "trucos" para conseguirlo para generar el SQL correcto, el API Criterios parece prometedor, pero también tiene varias limitaciones cuando se trata de consultas arbitrarias.
MyBatis - No hay API similar a Criteria pero es clara y limpia y, a menudo no requiere los trucos y tweeks de Hibernate. Limitada abstracción de la base de datos.
Algunas otras soluciones que aún no se han evaluado incluyen: SQLBuilder, Squiggle, Querydsl, JOOQ o una solución personalizada.
Lo que han encontrado los usuarios de SO funciona mejor para hacer un servicio de búsqueda rápido y versátil.
[Actualización] - Algunos de los trucos y los problemas que he enfrentado con Hibernate son ...
- https://hibernate.onjira.com/browse/HHH-879
- https://hibernate.onjira.com/browse/HHH-5291
- How to apply Where clause to secondary table
- https://forum.hibernate.org/viewtopic.php?f=1&t=973514
En general, joi a la misma mesa dos veces parece causar problemas. Incluso he logrado engañar a Hibernate para que produzca el SQL correcto solo para que correlacione los resultados incorrectamente porque almacenó en caché la primera instancia de la entidad y asumió que las columnas de la segunda unión eran redundantes. Las uniones condicionales expresadas a través de anotaciones también son dolorosas. No digo que sea imposible, pero muy críptico y no intuitivo.
Para responder a X-Zero a continuación, quiero pasar de una especificación a un resultado. Es decir, el consumidor me dice lo que sabe y creo una consulta que responde su pregunta sobre la marcha. En la práctica, pretendo tener algunos límites sobre lo que pueden pasar.
¿Le parece más sobre los "trucos" de hibernación a los que se refiere? ¿Sus consultas contienen cláusula (s) de selección interna (s)? Un par de ejemplos de consultas complejas también ayudarán. – limc
¿Y cómo espera poder crear estas consultas, si no las está escribiendo usted mismo? ¿Va a tener una interfaz con casillas de verificación (para cosas como 'ocurrió en el pasado), o algún tipo de vista de modelado (el SQL que he visto a partir de estos no suele ser tan bueno, y puede ser difícil de hacer cosas avanzadas en tal interfaz). Y supongo que al menos está bloqueando los privilegios del usuario de la base de datos, si permite SQL dinámico especificado por el usuario. –
@limic: consulte la actualización, sería un comentario bastante largo –