Spring CrudRepository findByInventoryIds(List <Long> ventoryIdList)-等同于IN子句


169

在Spring CrudRepository中,我们是否支持字段的“ IN子句”?即类似于以下内容?

 findByInventoryIds(List<Long> inventoryIdList) 

如果没有这样的支持,可以考虑哪些优雅的选择?触发每个ID的查询可能不是最佳选择。

Answers:


283

findByInventoryIdIn(List<Long> inventoryIdList) 应该可以。

HTTP请求参数格式如下所示:

Yes ?id=1,2,3
No  ?id=1&id=2&id=3

有关JPA存储库关键字的完整列表,请参见当前文档列表。它表明这IsIn是等效的-如果您更喜欢动词以提高可读性-并且JPA还支持NotInIsNotIn


谢谢,这正是我想要的。他们是否将其记录在CrudRepository页面中,或者通过阅读代码来发现?
Espresso 2013年

1
它实际上在参考文档中列出。
奥利弗·德罗博姆

谢谢。那“宝石隐藏在附录B中”,是这样的:)
浓缩咖啡(Espresso)2013年

11
参考文档 URL改变
Mayjak

1
对于方法签名:List <Person> findByIdIn(List <Integer> ids); 我收到错误:原因:java.lang.NumberFormatException:对于输入字符串:“(1,2)”
user64141 '16

103

对于Spring CrudRepository中的任何方法,您应该可以自己指定@Query。这样的事情应该起作用:

@Query( "select o from MyObject o where inventoryId in :ids" )
List<MyObject> findByInventoryIds(@Param("ids") List<Long> inventoryIdList);

谢谢,这有效。正在寻找“更清洁”的解决方案,即不编写@Query。
浓缩咖啡

3
奥利弗·吉尔克(Oliver Gierke)是知道这一问题答案的人,他拥有“更清洁”的解决方案。你应该接受他的回答。
digitaljoel

1
大!我使用a Set<String>作为参数,效果很好。
BlueBird

如果我想将2个参数传递给我的方法一个列表,而另一个传递给普通字符串该怎么办?如果是的话,我该如何命名我的方法
user3614936

22

是的,这是受支持的。

查看此处提供的文档,以获取方法名称中受支持的关键字。

您可以只在存储库界面中定义方法,而无需使用@Query批注和编写自定义查询。您的情况如下:

List<Inventory> findByIdIn(List<Long> ids);

我假设您具有Inventory实体和InventoryRepository接口。您的情况下的代码应如下所示:

实体

@Entity
public class Inventory implements Serializable {

  private static final long serialVersionUID = 1L;

  private Long id;

  // other fields
  // getters/setters

}

仓库

@Repository
@Transactional
public interface InventoryRepository extends PagingAndSortingRepository<Inventory, Long> {

  List<Inventory> findByIdIn(List<Long> ids);

}

这适用于扩展CrudRepository接口的所有接口。
Dzinot

1
如果ID大小超过1000或特定大小(取决于数据库),则此方法将无效。这个怎么样? List <Inventory> findByIdIn(List <Long> ids,Pageable pageable);
朱莉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.