Spring Data Rest:将Collection <entity>作为查询String参数传递

时间:2016-04-19 21:02:12

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

首先,这与Spring Data Rest: How to search by another object's key?相关,似乎已在https://jira.spring.io/browse/DATAREST-502中解决了

我的问题是(我相信)并延伸到此。我看到以下行为:

  1. 我定义了两个存储库查询,例如

    Person findByAccount(@Param("account") Account account));
    
    Collection<Person> findByAccountIn(@Param("accounts") Collection<Account> accounts));
    
  2. 这两种搜索方法都是通过spring-data-rest公开的。我可以使用http://localhost:8080/people/search/findByAccount?account=http://localhost:8080/accounts/1
  3. 等网址访问第一个
  4. 我可以使用http://localhost:8080/people/search/findByAccountIn?accounts=http://localhost:8080/accounts/1之类的网址访问第二种方法,但如果我尝试传入多个帐户,例如

    http://localhost:8080/people/search/findByAccountIn?accounts=http://localhost:8080/accounts/1,http://localhost:8080/accounts/2,
    

    除了IGNORE第一个帐户(http://localhost:8080/accounts/1)以及仅根据第二个帐户(http://localhost:8080/accounts/2

  5. 进行搜索外,它将运行查询

    通过REST API将实体集合传递给存储库参数的正确方法是什么?我发现它适用于单个实体,但不适用于Collection。请注意,直接访问JpaRepository时,这两个存储库方法都按预期工作。

    另请注意,如果集合具有某种基本类型,则这些查询似乎有效,例如findByAccountIdIn(@Param("accountIds") Collection<Long> accountIds)可通过http://localhost:8080/people/search/findByAccountIdIn?accountIds=1,2通过预期功能访问。这让我相信,将URI列表传递给需要相应实体集合的查询方法的方式可能是一个错误。

    提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

尝试重复查询参数,因为大多数服务器会将其解释为列表。它可能不是最漂亮的解决方案,但应该有效。

http://localhost:8080/people/search/findByAccountIn?accounts=http://localhost:8080/accounts/1&accounts=http://localhost:8080/accounts/2

答案 1 :(得分:0)

我知道这已经永远古老了,但是我找到了答案。
我将把它放在这里,供其他应该这样徘徊的人使用:

How to use List in endpoint exported by Spring Data REST?

List<Person> findByAccountIn(@Param("accounts") Account... accounts);

请求看起来像这样:

http://localhost:8080/people/search/findByAccountIn?accounts=http://localhost:8080/accounts/1&accounts=http://localhost:8080/accounts/2&accounts=http://localhost/accounts/anotheraccountid