使用Acos / having / cross-Join的grails executeQuery

时间:2013-09-01 08:41:32

标签: grails hql having-clause executequery

我想执行zip-search的查询。我有一个像这样的域模型:

class Zip_data {
int zc_loc_id 
String zc_zip 
String zc_location_name 
double zc_lat 
double zc_lon

static constraints = {
    zc_loc_id()
    zc_zip()
    zc_location_name()
    zc_lat()
    zc_lon()
}
}

现在我尝试通过“Zip_data.executeQuery(query)”方法执行以下查询:

SELECT 
        dest.zc_zip, 
        dest.zc_location_name,
        ACOS(
             SIN(RADIANS(src.zc_lat)) * SIN(RADIANS(dest.zc_lat)) 
             + COS(RADIANS(src.zc_lat)) * COS(RADIANS(dest.zc_lat))
             * COS(RADIANS(src.zc_lon) - RADIANS(dest.zc_lon))
        ) * 6380 AS distance
    FROM zip_data dest
    CROSS JOIN zip_data src
    WHERE src.zc_zip = 20537
    AND dest.zc_loc_id <> src.zc_loc_id
    HAVING distance < 10
    ORDER BY distance

但是由于“CROSS JOIN”或“HAVING”不允许,或者“zip_data未映射”或类似的任何内容,我总是遇到一些错误......

我认为可以执行随机查询并获​​取查询选择的所有颜色...是否有默认域模型我可以做这些事情?

有人可以帮我解决如何执行此查询的问题吗?

感谢您的帮助!

格尔茨

V

编辑: 我想使用“http://opengeodb.org/wiki/OpenGeoDB”的数据。 是不是可以在默认对象或任何类型的数据库上对数据库执行随机查询并获​​得哈希数组?或者是否可以创建一个子选择以将同一个表映射两次?我尝试以更简单的方式创建此查询:

SELECT 
dest.zc_zip, 
dest.zc_location_name,
(Select (ACOS(
     SIN(RADIANS(src.zc_lat)) * SIN(RADIANS(dest.zc_lat)) 
     + COS(RADIANS(src.zc_lat)) * COS(RADIANS(dest.zc_lat))
     * COS(RADIANS(src.zc_lon) - RADIANS(dest.zc_lon))
) * 6380) FROM zip_data as src where src.zc_loc_id<>dest.zc_loc_id and src.zc_loc_id = 20537)
AS distance
FROM zip_data dest

我知道这不是相同的SQL,但我也得到错误:zip_data未映射。有没有办法映射它并像这样使用它?

1 个答案:

答案 0 :(得分:1)

好的,我现在找到了解决方案。我不知道为什么,但是因为连接似乎不可能在一个sql中...我不确定查询中是否还有其他错误(可能是tablename或其他任何东西的情况),但是我得到两个请求: 首先我得到源zip的数据(我想开始半径搜索的地方)

def sourcePlz = Zip_data.findByZc_zip('20537')

之后我可以用10千米的示例半径进行搜索:

def query = """FROM Zip_data as dest WHERE dest.zc_lat IS NOT NULL AND dest.zc_lon IS
                    NOT NULL
                    AND 6371.0*ACOS(
                    COS(RADIANS(dest.zc_lat))*COS(RADIANS(:qlat))*COS(RADIANS(dest.zc_lon)-RADIANS(:qlon))
                    + SIN(RADIANS(dest.zc_lat))*SIN(RADIANS(:qlat)) ) < :qradius 
                    """
        plz_objs = Zip_data.executeQuery(query, [qlat:sourcePlz.zc_lat, qlon:sourcePlz.zc_lon, qradius:umkreis.toDouble()])

这就是全部:)我在半径10公里的范围内得到了所有的sourceZip拉链。 我希望这能帮助所有尝试过同样的人。

格尔茨

V