在Spring cruudrepository中,我们是否支持字段的“In子句”?是类似于下面的东西吗?

 findByInventoryIds(List<Long> inventoryIdList) 

如果没有这样的支持,那么可以考虑哪些优雅的选项呢?对每个id发起查询可能不是最佳的。


当前回答

是的,这是支持的。

查看这里提供的文档,了解方法名中所支持的关键字。

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

}

其他回答

findByInventoryIdIn(List<Long> inventoryIdList)应该做到这一点。

HTTP请求参数格式如下:

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

JPA存储库关键字的完整列表可以在当前文档列表中找到。它表明IsIn是等效的(如果您更喜欢使用动词来提高可读性的话),并且JPA还支持NotIn和IsNotIn。

如果inventoryId有主键,您可以简单地使用yourRepo.findAll(inventoryIdList)。

是的,这是支持的。

查看这里提供的文档,了解方法名中所支持的关键字。

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

}

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

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