2010-11-09 5 views
3

Salut J'ai essayé de trouver la meilleure façon de le faire aujourd'hui en vain.Hibernate Restrictions/Critères Débutant Question

Ce que je voudrais idéalement faire est de créer une distance d'alias calculée par la formule SQL ci-dessous (bien que je suis ouvert à d'autres façons de calculer la distance, c'était le chemin qui semblait, il devrait être plus facile)

Une fois que j'ai cet alias je veux être capable de l'utiliser dans un mode Restrictions pour trouver tout ce qui se trouve à une certaine distance. Je voudrais aussi être en mesure de trier par distance.

Ceci fait partie d'un plus grand critère de recherche qui est construit donc j'aimerai idéalement continuer à utiliser des critères. (Je limite déjà la plage de valeurs Lat et Long pour faire le calcul de la distance nécessaire à moins de champs.

Criteria criteria = session.createCriteria(Activity.class) 
     .createAlias("activityLocations", "actloc") 
     .createAlias("actloc.location", "location") 
     .createAlias("location.address", "addr"); 
     criteria.add((Restrictions.and(Restrictions.between("addr.latitude", latmin,  
     latmax),Restrictions.between("addr.longitude", truelongmin, truelongmax)))); 


     String sql = "SQRT(POW(69.1 * (addr3_.latitude - " + point[1]  
     +") , 2) + POW(69.1 * ("+point[0] +" - addr3_.longitude) * COS(addr3_.latitude /" 
     +" 57.3) , 2)) < "+distance;  
     criteria.add(Restrictions.sqlRestriction(sql)); 

Actuellement j'addr3_ dans la requête SQL parce que je regardais à la sortie verbeuse et c'est la façon dont Hibernate a généré la requête (ce hack a fonctionné dans l'instance que je regardais mais je crains de penser aux implications à plus long terme donc je ne veux pas qu'il reste là !!)

Répondre

4

Dans les restrictions SQL, vous pouvez vous référer au alias de la racine de critères {alias} Pour l'utiliser dans ce cas, vous avez besoin d'un "sous-critère" racine à location.address:

Criteria criteria = session.createCriteria(Activity.class) 
     .createAlias("activityLocations", "actloc") 
     .createAlias("actloc.location", "location"); 

Criteria addr = criteria.createCriteria("location.address"); 
addr.add((Restrictions.and(Restrictions.between("latitude", latmin,  
     latmax), Restrictions.between("longitude", truelongmin, truelongmax)))); 

String sql = "SQRT(POW(69.1 * ({alias}.latitude - " + point[1]  
     +") , 2) + POW(69.1 * ("+point[0] +" - {alias}.longitude) * COS({alias}.latitude /" 
     +" 57.3) , 2)) < "+distance;  
addr.add(Restrictions.sqlRestriction(sql));