230

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

 findByInventoryIds(List<Long> inventoryIdList) 

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

4

3 回答 3

379

findByInventoryIdIn(List<Long> inventoryIdList)应该做的伎俩。

HTTP 请求参数格式如下:

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

JPA 存储库关键字的完整列表可以在当前文档列表中找到。它表明这IsIn是等价的——如果你更喜欢动词以提高可读性——并且 JPA 还支持NotInIsNotIn.

于 2013-09-25T04:42:07.417 回答
125

对于 Spring CrudRepository 中的任何方法,您应该能够自己指定 @Query。像这样的东西应该工作:

@Query( "select o from MyObject o where inventoryId in :ids" )
List<MyObject> findByInventoryIds(@Param("ids") List<Long> inventoryIdList);
于 2013-09-24T16:47:16.893 回答
33

是的,这是支持的。

检查此处提供的文档以了解方法名称中支持的关键字。

您可以只在存储库接口中定义方法,而无需使用@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);

}
于 2017-05-11T15:10:38.157 回答