0

我想执行 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

但是由于不允许“交叉连接”或“HAVING”,或者“zip_data 未映射”或类似的任何东西,我总是遇到一些错误......

我认为可以执行随机查询并取回查询选择的所有列...是否有默认域模型可以在其中执行此类操作?

谁能帮我如何执行这个查询?

感谢帮助!

格雷茨

编辑:我想使用“ 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 未映射。有没有办法像这样映射和使用它?

4

1 回答 1

1

好的,现在我找到了解决方案。我不知道为什么,但是由于连接,在一个 sql 中似乎是不可能的...我不确定查询中是否还有另一个错误(可能是表名或其他任何错误),但是我通过两个请求得到它:首先我得到源 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 的所有拉链。我希望这可以帮助所有尝试过相同的人。

格雷茨

于 2013-09-05T05:26:04.983 回答