2010-10-07 26 views
2

J'utilise Hibernate dans une application de magasinage. Pour la recherche de proximité en SQL, j'utilise la formule haversine. Parce que c'est un peu compliqué SQL j'ai créé une requête SQL nommée dans mon fichier .hbm.xml pour cela.Combiner NamedQuery et les critères dans Hibernate

SELECT 
    location.*, 
    (3959 * acos(cos(radians(7.4481481)) * 
     cos(radians(X(location.coordinates))) * 
     cos(radians(Y(location.coordinates)) - radians(46.9479986)) + 
     sin(radians(7.4481481)) * sin(radians(X(location.coordinates))))) 
    AS distance  
FROM 
    location   
WHERE 
    location.coordinates IS NOT NULL 
HAVING 
    distance < :radius 
ORDER BY 
    distance ASC 
LIMIT :max 

Mais j'ai aussi un filtre défini par l'utilisateur (heures d'ouverture, assortiments, etc.). Pour cela, j'utilise les critères Hibernate pour ajouter des filtres par programmation.

Maintenant, j'ai un NamedQuery fonctionnant parfaitement qui me donne tous les emplacements autour d'un certain point et une requête de critères fonctionnant parfaitement me donnant tous les emplacements selon un filtre.

Ma question est: Quelle est la meilleure façon pour Hibernate de combiner ces deux bêtes? (c'est-à-dire que j'ai besoin que tous les emplacements autour d'un certain point satisfassent un filtre.) Existe-t-il par exemple un moyen quelconque d'utiliser une requête Named comme sous-requête dans une recherche de critères?

+0

Ou est-il possible d'exprimer la recherche de proximité en utilisant des critères? Je pourrais bien sûr vivre avec ça. Je ne sais pas comment le faire (c'est-à-dire comment faire l'équivalent de l'ajout de l'expression de la formule haversine à la clause SELECT, puis de s'y référer dans le HAVING with Criteria). – apropoz

Répondre

1

Quelle est la meilleure façon pour Hibernate de combiner ces deux bêtes?

À ma connaissance, ce n'est pas possible. Donc soit écrire tout en utilisant une requête Criteria (je ne sais personnellement pas comment faire ce que vous demandez) ou calculer une chaîne HQL dynamique.

+0

J'espérais pouvoir éviter la construction dynamique de cordes. Mais je suppose qu'il n'y a pas d'autre option. Ce serait génial si Hibernate supportait cela à l'avenir! – apropoz