6
votes

Java / Hibernate: Comment écrire un code DAO pour les SQL complexes

Mon lieu de travail actuel utilise la combinaison standard Spring / Hibernate / JSP pour servir du contenu à son client Flex via XML. Il existe de nombreuses façons dans lesquelles les données sont accessibles, mais la plus répandue est la plus répandue via des appels SQL directs à la base de données et une conversion manuelle en XML.

Le problème est que, comme l'application devint plus grosse, les SQLS sont devenus beaucoup plus complexes et difficiles à entretenir. Comme s'il n'était pas suffisamment fort pour maintenir des SQLS créés à l'aide de Stringbuilders, cela est encore pire, que les SQLS sont construits de manière dynamique en utilisant de nombreuses déclarations et boucles.

Je sais que, généralement la bonne façon de partir, c'est chercher des articles à l'aide de requêtes et d'entités hibernate. Toutefois, dans certaines de nos demandes, les résultats ne peuvent pas être mappés à une seule entité hibernée et je crains que la SQL direct doit être utilisée.

Quelle serait la bonne façon d'y aller? Existe-t-il un moyen de faire des requêtes SQL dynamiques plus lisibles? Y a-t-il un moyen de le faire avec des entités hibernées?

Je suis désolé pour la nature abstraite de cette question. J'espère que vous avez néanmoins une bonne contribution;)

Appréciez vos commentaires!


0 commentaires

3 Réponses :


2
votes

Vous pouvez envisager de déplacer une partie de la logique SQL dans la base de données et d'accéder aux données via des vues: cela présente ses propres problèmes, bien sûr (vous avez maintenant une logique commerciale à deux endroits), mais pourraient valoir la peine d'être envisagée.


1 commentaires

Je suis en quelque sorte d'accord ici, même si beaucoup de gens n'aiment pas les Procs et la logique stockés dans SQL. Si vous avez une requête SQL vraiment complexe, il n'est vraiment aucun moyen de le rendre plus simple en essayant de le faire en code ou en utilisant une langue de requête moins robuste comme HQL.



3
votes

HQL prend en charge les requêtes qui vont chercher plus d'une entité. Les jointures sont également prises en charge. Par exemple:

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


0 commentaires

0
votes

En supposant que vous ne puissiez pas faire ce dont vous avez besoin dans HQL, jetez un coup d'œil à ibatis Cela vous permettra Pour configurer des mappages à l'aide de requêtes SQL spécifiques et des procédures stockées. Il s'agira également d'une autre dépendance à votre projet afin de le prendre en compte.


0 commentaires