% Like% Query ในฤดูใบไม้ผลิ JpaRepository


111

ฉันต้องการเขียนข้อความค้นหาที่คล้ายกันJpaRepositoryแต่ไม่ได้ส่งคืนอะไรเลย:

LIKE '%place%'- ไม่ทำงาน

LIKE 'place' ทำงานได้อย่างสมบูรณ์

นี่คือรหัสของฉัน:

@Repository("registerUserRepository")
public interface RegisterUserRepository extendsJpaRepository<Registration,Long> {

    @Query("Select c from Registration c where c.place like :place")
     List<Registration> findByPlaceContaining(@Param("place")String place);
}

คำตอบ:


200

ข้อความค้นหา JPA ของ Spring data จำเป็นต้องมีตัวอักษร "%" และอักขระเว้นวรรคตามlikeในข้อความค้นหาของคุณเช่นเดียวกับใน

@Query("Select c from Registration c where c.place like %:place%").

Cf. http://docs.spring.io/spring-data/jpa/docs/current/reference/html

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

List<Registration> findByPlaceContaining(String place);

เพียงพอแล้ว


23
นอกจากนี้ยังอาจมีประโยชน์ในการละเว้นกรณีสำหรับแบบสอบถามโดยใช้: findByPlaceIgnoreCaseContaining (สถานที่สตริง);
ilyailya

เช่นเดียวกับความคิดเห็นด้านข้างคุณไม่สามารถผสมและจับคู่%: param% กับ% param% ภายในข้อความค้นหาเดียวกันได้ มิฉะนั้นแอปจะไม่เริ่มทำงาน
RVP

ขอบคุณ. ฉันเคยเขียนlike '%:place%'ด้วย'และไม่มีผลลัพธ์เลยเพราะ Hibernate เพิ่ม's ให้กับสตริงด้วยตัวเอง
Yamashiro Rion

นี่ไม่ใช่การตอบสนองที่ดีและอาจเป็นอันตรายได้เช่นกัน Spring ได้แยกสิ่งนี้ออกด้วย ContainingIgnoreCase ตรวจสอบคำตอบของฉันร้อง
Alexius DIAKOGIANNIS

100

คุณไม่ต้องการ@Queryคำอธิบายประกอบเลย

คุณสามารถใช้สิ่งต่อไปนี้

    @Repository("registerUserRepository")
    public interface RegisterUserRepository extends JpaRepository<Registration,Long>{

    List<Registration> findByPlaceIgnoreCaseContaining(String place);

    }

สำหรับฉันนี่คือทางออกที่ดีที่สุด ฉันไม่รู้ว่าคุณสามารถใช้ IgnoreCase ร่วมกับ Containing ได้ซึ่งไม่ได้อยู่ในเอกสารประกอบ
Wilson Campusano

1
แล้วกรณีที่ฉันต้องการใช้หลายคอลัมน์ล่ะ? - ฉันเชื่อว่า@Query()ต้องใช่มั้ย? ด้วยวิธีการดังกล่าวฉันจะต้องทำให้orนั่นไม่ใช่ทางออกที่ดีสำหรับกรณีนั้น:findByField1OrField2Containg(String phraseForField1, String phraseForField2)
user3529850

28

นอกจากนี้คุณยังสามารถดำเนินการตามคำสั่งเช่นใช้ Spring ข้อมูล JPA สนับสนุนคำหลัก"ที่มี"

List<Registration> findByPlaceContaining(String place);

20

สำหรับกรณีของคุณคุณสามารถใช้วิธี JPA ได้โดยตรง ที่เหมือนร้อง:

ประกอบด้วย: เลือก ... เช่น%: สถานที่%

List<Registration> findByPlaceContainingIgnoreCase(String place);

ที่นี่IgnoreCaseจะช่วยให้คุณค้นหารายการโดยไม่สนใจกรณี

ใช้ @Query ใน JPQL :

@Query("Select registration from Registration registration where 
registration.place LIKE  %?1%")
List<Registration> findByPlaceContainingIgnoreCase(String place);

วิธีการที่เกี่ยวข้องมีดังนี้

  1. ชอบ findByPlaceLike

    …ที่ไหน x.place ชอบ 1

  2. เริ่มต้นด้วย findByPlaceStartingWith

    …โดยที่ x.place ชอบ 1 (พารามิเตอร์ผูกกับ% ต่อท้าย)

  3. สิ้นสุดด้วย findByPlaceEndingWith

    …โดยที่ x.place ชอบ? 1 (พารามิเตอร์ผูกด้วย% นำหน้า)

  4. ที่มี findByPlaceContaining

    …โดยที่ x.place ชอบ 1 (พารามิเตอร์ที่ถูกผูกไว้ใน%)

ข้อมูลเพิ่มเติมดูที่ลิงค์นี้ , การเชื่อมโยงนี้และนี้

หวังว่านี่จะช่วยคุณได้ :)


6

คุณสามารถมีทางเลือกอื่นในการใช้ตัวยึดตำแหน่งได้ดังนี้

@Query("Select c from Registration c where c.place LIKE  %?1%")
List<Registration> findPlaceContainingKeywordAnywhere(String place);

4

ลองทำตามนี้

@Query("Select c from Registration c where c.place like '%'||:place||'%'")

มีประโยชน์หากเราใช้something=:placeและanother like %:place%ในการสืบค้น
hong4rc


1

ตอบว่าจะเป็น

-> `@Query (" เลือกคุณจากหมวดหมู่ u โดยที่ u.categoryName เช่น%: input% ")
     รายการ findAllByInput (@Param ("อินพุต") สตริงอินพุต);

0

พบวิธีแก้ปัญหาโดยไม่ต้อง@Query(จริงๆแล้วฉันลองใช้อันไหน "ยอมรับ" อย่างไรก็ตามมันไม่ได้ผล)

ต้องส่งคืนPage<Entity>แทนList<Entity>:

public interface EmployeeRepository 
                          extends PagingAndSortingRepository<Employee, Integer> {
    Page<Employee> findAllByNameIgnoreCaseStartsWith(String name, Pageable pageable);
}

IgnoreCase เป็นส่วนสำคัญสำหรับการบรรลุเป้าหมายนี้!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.