1

假设我有一个表示坐标(纬度和经度)的 POJO 和表示地点的域类。地方有一个坐标。

坐标.groovy

class Coordinate implements Serializable{
    float latitude
    float longitude
    ...
}

CoordinateUserType.groovy

class CoordinateUserType implements UserType{

    int[] sqlTypes() { [Types.FLOAT, Types.FLOAT]}

    public Object nullSafeGet(rs, names, owner){
        /*not full code published, just what is relevant*/
        return new Coordinate(rs.getFloat(names[0]), rs.getFloat(names[1]))
    }
    public Object nullSafeSet(st, object, index){
        /*not full code published, just what is relevant*/
        st.setFloat(index, value.latitude)
        st.setFloat(index+1, value.longitude)
    }


}

Place.groovy

class Place{
    ...
    Coordinate coordinate
    ...
    static mapping = {
        coordinate type:CoordinateUserType, {
            column name:'latitude'
            column name:'longitude'
        }
    }

}

我为坐标(2 列)创建了一个用户类型,并在地点域类的映射中引用它。

我可以正确地创建和列出地点。

但我想根据坐标查询这些地方,比如

在哪里:

def matchingPlaces = Place.where{
    coordinate.latitude > 0 && coordinate.latitude < 10 &&
    coordinate.longitude > 0 && coordinate.longitude < 10
}

有标准:

def matchingPlaces = Place.createCriteria().list{
    and{
        between('coordinate.latitude', 0,10)
        between('coordinate.longitude', 0,10)
    }
}
/*or */
def matchingPlaces = Place.createCriteria().list{
    coordinate{
        and{
            between('latitude', 0,10)
            between('longitude', 0,10)
        }
    }
}

但是无论我在 between 闭包的列名中输入什么,我总是得到一个错误“无法解析属性”。

查询具有多列的自定义用户类型的过程是什么?

提前致谢

4

2 回答 2

2

只需embed在您的Place

static embedded = ['coordinate']

您不需要自定义映射,也可以删除CoordinateUserType

以下将起作用:

def matchingPlaces = Place.createCriteria().list{
    coordinate{
        and{
            between('latitude', 0,10)
            between('longitude', 0,10)
        }
    }
}
于 2013-10-01T18:38:38.387 回答
0

假设您的域如下所示:

class Place {
    ...
    Coordinate coordinate
    ...
}

您可以在您的条件内访问此嵌套域,如下所示:

coordinate{
    and {
        between('latitude', 0, 10)
        between('longitude', 0, 10)
    }
}

未经测试,但应该可以工作......

于 2013-10-01T12:34:47.567 回答