将List <long>作为SDR查询参数传递给Spring Data Repository

时间:2017-02-17 01:34:34

标签: spring-data-jpa spring-data-rest

我有以下界面,该界面由我的几个存储库接口扩展:

public interface IdentifiableEntityRepository<T, ID extends Serializable> {

    @RestResource(path="findAll")
    public List<T> findByIdIn(@Param("ids") List<ID> ids);

}

这是一个碰巧有字符串ID的存储库示例:

public interface FooRepository extends IdentifiableEntityRepository<Foo, String>, 
        PagingAndSortingRepository<Foo, String> 
{
    ...
}

...和另一个恰好有长ID的例子:

public interface BarRepository extends IdentifiableEntityRepository<Bar, Long>, 
        PagingAndSortingRepository<Bar, Long> 
{
    ...
}

对于String示例,我能够成功查询findAll端点,如下所示:

GET /api/data/foo/search/findAll?ids=eenie,meenie,miney,moe

但是对于Long示例,类似的查询会产生500服务器错误

GET /api/data/bar/search/findAll?ids=1035,1036,1042,2048

{
  "timestamp": "2017-02-17T00:00:33.547Z",
  "status": 500,
  "error": "Internal Server Error",
  "exception": "org.springframework.dao.InvalidDataAccessApiUsageException",
  "message": "org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value element [1035] did not match expected type [java.lang.Long (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value element [1035] did not match expected type [java.lang.Long (n/a)]",
  "path": "/api/data/bar/search/findAll"
}

org.hibernate.jpa.spi.BaseQueryImpl.validateCollectionValuedParameterBinding()的Hibernate JPA中引发了IllegalArgumentException。当我在那里放置一个断点时,很明显以逗号分隔的字符串作为&#34; ids&#34;查询参数被成功解析为List<String>,然后通过各层(spring-data-rest - &gt; spring-data - &gt; spring-data-jpa - &gt; hibernate-jpa)。然后,注释的BaseQueryImpl方法迭代String元素检查以查看它们是否是预期的Long类型的实例。他们不是,因此,IllegalArgugmentException。

我还尝试过以下方法:

GET /api/data/bar/search/findAll?ids=1035l,1036l,1042l,2048l

...但这也给出了同样的错误。

所以问题:我真的想在IdentifiableEntityRepository接口中使用通用的,泛型增强的方法声明,以便我可以在多个存储库中重用它。有没有办法解析&#34; ID&#34;查询参数类型感知,以便它可以使用非字符串ID吗?

0 个答案:

没有答案