2010-01-26 19 views
6

Mi lugar de trabajo actual utiliza la mezcla Spring/Hibernate/JSP estándar para servir contenido a su cliente Flex a través de XML. Hay muchas maneras en que se accede a los datos, pero el más frecuente es a través de llamadas SQL directas a la base de datos y una conversión manual a XML.Java/Hibernate: cómo escribir código DAO para SQL complejos

El problema es que a medida que la aplicación creció, los SQL se volvieron mucho más complejos y difíciles de mantener. Como si no fuera lo suficientemente difícil mantener los SQL que se crearon usando StringBuilders, ahora es aún peor, que los SQL se construyen dinámicamente utilizando muchas sentencias y bucles if.

Sé que, por lo general, el camino correcto es buscar elementos utilizando las consultas y entidades de Hibernate. Sin embargo, en algunas de nuestras solicitudes, los resultados no pueden asignarse a una sola entidad de Hibernate y me temo que SQL directo debe ser utilizado.

¿Cuál sería la forma correcta de hacerlo? ¿Hay alguna manera de hacer más legibles las consultas SQL dinámicas? ¿Hay alguna manera de hacerlo con las entidades de Hibernate?

Disculpa la naturaleza abstracta de esta pregunta. Espero que tengas una buena entrada, no obstante;)

¡Gracias por sus comentarios!

Respuesta

3

HQL admite consultas que captan más de una entidad. Las uniones también son compatibles. Por ejemplo:

SELECT new com.package.model.SearchResultEntry(product, price) FROM Product product, 
    IN(product.variantPrices) price WHERE .... 

Los rendimientos por encima de un nuevo objeto que se compone de dos entidades - producto y el precio (no entidad!). También puede usar List para poner diferentes entidades del mismo resultado.

Give this tutorial leer a fondo.

hacer estas consultas con parámetros dinámicos, y el uso de las clases más apropiadas para almacenarlos como @NamedQueries

2

Podría considerar mover parte de la lógica SQL a la base de datos y acceder a los datos mediante vistas: eso presenta sus propios problemas, por supuesto (ahora tiene lógica comercial en dos lugares) pero podría valer la pena considerar.

+0

Estoy de acuerdo aquí, a pesar de que a mucha gente no le gustan los procesos almacenados y la lógica en SQL. Si tiene una consulta SQL realmente compleja, no hay forma de simplificarla al intentar hacerlo en código, o utilizando un lenguaje de consulta menos robusto como HQL. –

0

Suponiendo que no puede hacer lo que necesita en HQL echar un vistazo a ibatis Se le permitirá realizar asignaciones usando consultas SQL específicas y procedimientos almacenados. También será otra dependencia de tu proyecto, así que tenlo en cuenta también.

Cuestiones relacionadas