Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SpringDataRedis存储库指定GeoRadius命令附加参数?_Spring_Redis_Spring Data_Spring Data Redis - Fatal编程技术网

如何使用SpringDataRedis存储库指定GeoRadius命令附加参数?

如何使用SpringDataRedis存储库指定GeoRadius命令附加参数?,spring,redis,spring-data,spring-data-redis,Spring,Redis,Spring Data,Spring Data Redis,我正在使用SpringDataRedis保存一些地址,每个地址都包含一个location属性,类型为Point,它保存特定地址的地理坐标。此外,该属性用@GeoIndexed注释。如此处所述: 我的地址型号如下: @RedisHash("addresses") public class Address { @Id private String id; @GeoIndexed private Point location; } 通过此存储

我正在使用SpringDataRedis保存一些地址,每个地址都包含一个
location
属性,类型为
Point
,它保存特定地址的地理坐标。此外,该属性用
@GeoIndexed
注释。如此处所述:

我的
地址
型号如下:

@RedisHash("addresses")
public class Address {    
    @Id
    private String id;    

    @GeoIndexed
    private Point location;    
}
通过此存储库查询,我能够获得给定点和距离附近的所有地址:

public interface AddressRepository extends CrudRepository<Address, String> {
    List<Address> findByLocationNear(Point location, Distance distance);
}
公共接口地址存储库扩展了crudepository)

因此,一般来说,我需要一种向这个查询传递额外参数的方法,比如排序或限制结果(任何选项)


有人能帮忙吗?

您可以通过使用
地理操作
类实现您的解决方案来绕过这个问题

通过这种方式,您可以使用RedieoCommands.GeoRadiusCommandArgs.limit(n)
将结果数量限制在前n个匹配项

请看一下Spring Data Redis的官方文档:

您还可以在SpringDataRedis测试中直接找到一些示例

更新:

这是我通过实现新的
服务
方法而不是
存储库
得到的最后一个代码:

public class AddressService {
    private final StringRedisTemplate stringRedisTemplate;

    public AddressService(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    public List<Address> findByLocationNear(Point location, Distance distance) {
        Circle within = new Circle(location, distance);
        GeoRadiusCommandArgs args = GeoRadiusCommandArgs.newGeoRadiusArgs().sortAscending().limit(10);

        GeoOperations<String, String> geoOperations = stringRedisTemplate.opsForGeo();
        GeoResults<GeoLocation<String>> nearbyLocations = geoOperations.radius("addresses:location", within, args);

        // Convert geo results into addresses
        List<Address> addresses = ...;

        return addresses;
    }
}
公共类地址服务{
私有最终StringRedisTemplate StringRedisTemplate;
公共地址服务(StringRedisTemplate StringRedisTemplate){
this.stringRedisTemplate=stringRedisTemplate;
}
公共列表FindBylocationner(点位置、距离){
内圆=新圆(位置、距离);
GeoRadiusCommandArgs args=GeoRadiusCommandArgs.newGeoRadiusArgs().sortAscending().limit(10);
GeoOperations GeoOperations=stringRedisTemplate.opsForGeo();
GeoResults nearbyLocations=geocations.radius(“地址:位置”,内,args);
//将geo结果转换为地址
列表地址=。。。;
返回地址;
}
}

感谢您的回复,正如您在这里提到的,我通过使用
RedisTemplate
GeoRadiusCommandArgs
解决了这个问题。我会用我找到的最终代码更新你的答案。很高兴帮助你@knemr57。如果您能够发现如何创建一个对数据应用过滤器(条件)的复杂查询,请告诉我。似乎Lattuce图书馆在这个意义上对我来说有些问题。