Spring CrudRep repository findByInventoryIds (Danh sách <Long> InventIdList) - tương đương với mệnh đề IN


169

Trong Spring CrudRep repository, chúng tôi có hỗ trợ "mệnh đề IN" cho một trường không? tức là một cái gì đó tương tự như sau?

 findByInventoryIds(List<Long> inventoryIdList) 

Nếu hỗ trợ như vậy là không có sẵn, những lựa chọn thanh lịch có thể được xem xét? Truy vấn bắn cho mỗi id có thể không tối ưu.

Câu trả lời:


283

findByInventoryIdIn(List<Long> inventoryIdList) nên làm thủ thuật.

Định dạng tham số yêu cầu HTTP sẽ như vậy:

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

Danh sách đầy đủ các từ khóa kho lưu trữ JPA có thể được tìm thấy trong danh sách tài liệu hiện tại . Nó cho thấy điều đó IsInlà tương đương - nếu bạn thích động từ dễ đọc hơn - và JPA cũng hỗ trợ NotInIsNotIn.


Cảm ơn, đó chính xác là tôi đang tìm kiếm. Họ có tài liệu này trong trang CrudRep repository hay khám phá bằng cách đọc mã không?
Espresso

1
Nó thực sự được liệt kê trong tài liệu tham khảo .
Oliver Drotbohm

Cảm ơn. Đó là "viên ngọc được giấu trong phụ lục B", đúng vậy :)
Espresso

11
URL tài liệu tham khảo đã thay đổi
Mayjak

1
Đối với chữ ký phương thức: Danh sách <Person> findByIdIn (Danh sách <Integer> id); Tôi gặp lỗi: Nguyên nhân bởi: java.lang.NumberFormatException: Đối với chuỗi đầu vào: "(1, 2)"
user64141

103

Đối với bất kỳ phương thức nào trong Spring CrudRep repository, bạn sẽ có thể tự chỉ định @Query. Một cái gì đó như thế này sẽ hoạt động:

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

Cảm ơn, điều này làm việc. Đã tìm kiếm một giải pháp "sạch hơn" tức là không cần viết @Query.
Espresso

3
Oliver Gierke là người đàn ông sẽ biết câu trả lời cho điều này và anh ta có giải pháp "sạch hơn". Bạn nên chấp nhận câu trả lời của anh ấy.
Digitaljoel

1
Tuyệt quá! Tôi đã sử dụng Set<String>như là một tham số, làm việc tốt.
BlueBird

Điều gì xảy ra nếu tôi muốn truyền 2 tham số vào danh sách phương thức của mình và một chuỗi bình thường khác, liệu nó có hoạt động không? nếu có, làm thế nào để tôi đặt tên cho phương thức của mình
user3614936

22

Vâng, điều đó được hỗ trợ.

Kiểm tra các tài liệu được cung cấp ở đây để biết các từ khóa được hỗ trợ bên trong tên phương thức.

Bạn chỉ có thể xác định phương thức trong giao diện kho lưu trữ mà không cần sử dụng chú thích @Query và viết truy vấn tùy chỉnh của mình. Trong trường hợp của bạn, nó sẽ như sau:

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

Tôi giả sử rằng bạn có thực thể Inventory và giao diện InventoryRep repository . Mã trong trường hợp của bạn sẽ trông như thế này:

Thực thể

@Entity
public class Inventory implements Serializable {

  private static final long serialVersionUID = 1L;

  private Long id;

  // other fields
  // getters/setters

}

Kho lưu trữ

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

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

}

Điều này hoạt động cho tất cả các giao diện đang mở rộng giao diện CrudRep repository .
Dzinot

1
Điều này sẽ không hoạt động nếu kích thước id lớn hơn 1000 hoặc kích thước nhất định tùy thuộc vào DB. Còn cái này thì sao? Danh sách <Inventory> findByIdIn (Danh sách <Long> id, có thể phân trang được);
Julie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.