Spring CrudRepository findByInventoryIds (รายการ <Long> inventoryIdList) - เทียบเท่ากับ IN clause


169

ใน Spring CrudRepository เรามีการสนับสนุน "ในอนุประโยค" สำหรับฟิลด์หรือไม่? สิ่งที่คล้ายกับต่อไปนี้คืออะไร?

 findByInventoryIds(List<Long> inventoryIdList) 

หากการสนับสนุนดังกล่าวไม่สามารถใช้งานได้จะมีการพิจารณาตัวเลือกอะไรบ้าง คิวรีการยิงสำหรับแต่ละ id อาจไม่เหมาะสม

คำตอบ:


283

findByInventoryIdIn(List<Long> inventoryIdList) ควรทำเคล็ดลับ

รูปแบบพารามิเตอร์คำขอ HTTP จะเป็นดังนี้:

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

รายการที่สมบูรณ์ของคำหลัก JPA พื้นที่เก็บข้อมูลที่สามารถพบได้ในรายการเอกสารปัจจุบัน มันแสดงให้เห็นว่าIsInเทียบเท่า - ถ้าคุณต้องการคำกริยาเพื่อให้สามารถอ่าน - และที่ JPA ยังสนับสนุนและNotInIsNotIn


ขอบคุณนั่นคือสิ่งที่ฉันกำลังมองหา พวกเขามีเอกสารในหน้า CrudRepository หรือค้นพบโดยการอ่านรหัสหรือไม่
เอสเพรสโซ

1
มันจริงที่ระบุไว้ในเอกสารอ้างอิง
Oliver Drotbohm

ขอบคุณ "อัญมณีนั้นถูกซ่อนอยู่ในภาคผนวก B" ดังนั้นถูกต้อง :)
เอสเพรสโซ่

11
URL เอกสารอ้างอิงเปลี่ยนแล้ว
Mayjak

1
สำหรับลายเซ็นเมธอด: รายการ <Person> findByIdIn (รายการ <Integer> รหัส) ฉันได้รับข้อผิดพลาด: เกิดจาก: java.lang.NumberFormatException: สำหรับสตริงอินพุต: "(1, 2)"
user64141

103

สำหรับวิธีใด ๆ ใน Spring CrudRepository คุณควรระบุ @Query ด้วยตนเอง สิ่งนี้ควรใช้งานได้:

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

ขอบคุณมันใช้งานได้ กำลังมองหาโซลูชันที่ "สะอาดกว่า" เช่นโดยไม่ต้องเขียน @Query
Espresso

3
Oliver Gierke เป็นคนที่รู้คำตอบสำหรับเรื่องนี้และเขามีทางออกที่ "สะอาดกว่า" คุณควรยอมรับคำตอบของเขา
digitaljoel

1
ที่ดี! ฉันใช้Set<String>เป็นพารามิเตอร์ทำงานได้ดี
BlueBird

ถ้าฉันต้องการส่งพารามิเตอร์ 2 รายการไปยังวิธีการของฉันรายการหนึ่งและอีกสตริงปกติจะใช้งานได้หรือไม่ ถ้าใช่ฉันจะตั้งชื่อวิธีการของฉันได้อย่างไร
user3614936

22

ใช่ว่าได้รับการสนับสนุน

ตรวจสอบเอกสารที่ให้ไว้ที่นี่สำหรับคำหลักที่รองรับภายในชื่อวิธีการ

คุณสามารถกำหนดวิธีการในส่วนติดต่อที่เก็บโดยไม่ต้องใช้คำอธิบายประกอบ@Queryและเขียนแบบสอบถามที่กำหนดเองของคุณ ในกรณีของคุณมันจะเป็นดังนี้:

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

ฉันสมมติว่าคุณมีเอนทิตีสินค้าคงคลังและอินเทอร์เฟซของคลังโฆษณา รหัสในกรณีของคุณควรมีลักษณะเช่นนี้:

หน่วยงาน

@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
สิ่งนี้จะไม่ทำงานหากขนาดรหัสเกิน 1,000 หรือขนาดที่แน่นอนขึ้นอยู่กับฐานข้อมูล แล้วเรื่องนี้ล่ะ รายการ <Inventory> findByIdIn (รายการ <ยาว> id, สามารถเพจได้เพจ);
Julie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.