แบบสอบถามแบบไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ด้วย Spring CrudRepository


102

ด้วย Spring CrudRepository Query; ฉันต้องการเลือกเอนทิตี "DeviceType" ที่มีคุณสมบัติเป็น "ชื่อ" แต่การสืบค้นต่อไปนี้ให้เลือกสิทธิ์ในลักษณะที่คำนึงถึงตัวพิมพ์เล็กและใหญ่ ฉันจะทำให้ตัวพิมพ์เล็กหรือใหญ่ได้อย่างไร ขอบคุณ.

public interface DeviceTypeRepository extends CrudRepository<DeviceType, Integer>, JpaSpecificationExecutor<DeviceType> {

    public Iterable<DeviceType> findByNameContaining(String name);

}  

16
คุณลองpublic Iterable<DeviceType> findByNameIgnoreCaseContaining(String name);หรือยัง?
Peter Keller

ในกรณีที่คุณสนใจ Query โปรดลองสิ่งนี้ไม่จำเป็นต้องให้ '%' หลัง LIKE <code> @Query (value = "เลือก dt จาก DeviceType เป็น dt โดยที่ต่ำกว่า (dt.name) เช่นต่ำกว่า (: name)" ) สาธารณะ Iterable <DeviceType> anyMethodNameGoesHere (@Param (name) String name); </code>
Java_Fire_Within

สิ่งนี้อาจช่วยคุณได้stackoverflow.com/questions/37178520/jpql-like-case-insensitive/…
Shashank

คำตอบ:


197

ตรงตามที่ @Peter กล่าวไว้ในความคิดเห็นเพียงเพิ่มIgnoreCase:

public interface DeviceTypeRepository 
    extends CrudRepository<DeviceType, Integer>, JpaSpecificationExecutor<DeviceType> {

    public Iterable<DeviceType> findByNameContainingIgnoreCase(String name);
}  

ดูเอกสารประกอบสำหรับรายการคำหลักที่รองรับทั้งหมดในชื่อวิธีการ


ขอบคุณมากสำหรับคำตอบ; แน่ใจว่าฉันจะอ้างอิงเอกสารนั้น ขอขอบคุณ มีช่วงเวลาที่ดี !
Channa

3
มันได้ผลสำหรับฉัน ฉันใช้แบบสอบถาม JPA ตามเอกสารประกอบโดยที่ UPPER (x.firstame) = UPPER (? 1) ทำงาน
sunitha

@sunitha คุณรู้วิธีใดบ้างที่เราสามารถปรับเปลี่ยนพฤติกรรมนี้พูดว่า make it LOWER? ฐานข้อมูลของฉันมีการจัดทำดัชนีตามตัวพิมพ์เล็ก
Sudip Bhandari

@SudipBhandari: แน่นอนว่าคุณทำได้
sunitha

1
สำหรับคุณสมบัติหลายรายการซ้ำIgnoreCaseเช่นนี้:List<Account> findByUsernameIgnoreCaseAndDomainIgnoreCase(String username, String domain);
Tarator

11

คำค้นหา Spring data mongo ต่อไปนี้ใช้ได้กับฉัน ฉันต้องการใช้ListแทนIterator

public interface DeviceTypeRepository extends CrudRepository<DeviceType,Integer>, JpaSpecificationExecutor<DeviceType> {
    List<DeviceType> findByNameIgnoreCase(String name);
} 

1

ในกรณีของฉันการเพิ่มIgnoreCaseไม่ได้ผลเลย

ฉันพบว่าเป็นไปได้ที่จะให้ตัวเลือกสำหรับนิพจน์ทั่วไปเช่นกัน:

@Query(value = "{'title': {$regex : ?0, $options: 'i'}}")
Foo findByTitleRegex(String regexString);

iตัวเลือกที่จะทำให้การสอบถามกรณีตาย


1

สำหรับผู้ที่ใช้คำหลักบนแบบสอบถาม JPA ที่กำหนดเองและช่วยให้toUpperCase รหัสต่อไปนี้ใช้ได้กับฉัน

 return  entityManager.createQuery("select q from "table " q  where upper(q.applicant)=:applicant")
    .setParameter("applicant",applicant.toUpperCase().trim()).getSingleResult();

1
ระมัดระวังเมื่อใช้ 'upper (q.applicant)' ใน Postgres จะทำให้ '.PSQLException: ERROR: function upper (bytea) ไม่มี' เมื่อ q.applicant เป็น null
advortsov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.