Spring Data JPA มีวิธีใดในการนับเอนทิตีโดยใช้การแก้ไขชื่อวิธีการหรือไม่

Spring Data JPA รองรับเอนทิตีการนับโดยใช้ข้อกำหนดเฉพาะ แต่มันมีวิธีใดบ้างในการนับเอนทิตีโดยใช้การแก้ไขชื่อวิธีการ? สมมติว่าฉันต้องการวิธี countByName เพื่อนับเอนทิตีที่มีชื่อเฉพาะ เช่นเดียวกับวิธี findByName เพื่อดึงข้อมูลเอนทิตีทั้งหมดที่มีชื่อเฉพาะ


person YaoFeng    schedule 22.05.2012    source แหล่งที่มา
comment
โปรดยอมรับหนึ่งในคำตอบ เหยาเฟิง ฉันได้ทดสอบ Spring Data JPA 1.5.2 แล้วและไวยากรณ์ countByName() ทำงานเป็นบันทึกย่อของ Abel   -  person nullPainter    schedule 30.04.2014


คำตอบ (12)


ใน Spring Data 1.7.1.RELEASE คุณสามารถทำได้ด้วยสองวิธีที่แตกต่างกัน

  1. วิธีใหม่ โดยใช้การสืบค้นมาสำหรับการนับและการลบการสืบค้น อ่านสิ่งนี้ ( ตัวอย่างที่ 5) ตัวอย่าง,
    public interface UserRepository extends CrudRepository<User, Integer> {
        long countByName(String name);
    }
  1. วิธีเก่า การใช้คำอธิบายประกอบ @Query
    ตัวอย่าง
    public interface UserRepository extends CrudRepository<User, Integer> {
        @Query("SELECT COUNT(u) FROM User u WHERE u.name=?1")
        long aMethodNameOrSomething(String name);
    }

หรือใช้คำอธิบายประกอบ @Param ด้วย

public interface UserRepository extends CrudRepository<User, Integer> {
    @Query("SELECT COUNT(u) FROM User u WHERE u.name=:name")
    long aMethodNameOrSomething(@Param("name") String name);
}

ตรวจสอบคำตอบนี้ด้วย

person George Siggouroglou    schedule 13.12.2014
comment
แล้วฟังก์ชันรวมอื่นๆ เช่น ผลรวม, ค่าเฉลี่ย ล่ะ? - person lrkwz; 26.04.2015
comment
คำถามเกี่ยวกับฟังก์ชันการนับ ไม่ใช่ผลรวมหรือค่าเฉลี่ย Spring data ยังไม่รองรับบางอย่างเช่น 'วิธีใหม่' สำหรับฟังก์ชันนี้ คุณสามารถใช้สิ่งที่ชอบ สิ่งนี้ - person George Siggouroglou; 26.04.2015
comment
ในตัวอย่างที่สองและสามของคุณ ฉันคิดว่าคุณจะต้องใช้ SELECT COUNT(u)... เนื่องจากนี่ควรจะเป็นแบบสอบถามแบบนับ - person TheChrisPratt; 13.11.2015
comment
ขอบคุณสำหรับความคิดเห็นของคุณ. มันเป็นความผิดพลาดของฉัน - person George Siggouroglou; 15.11.2015
comment
ไม่ต้องกังวล เจอแล้ว - commons-lang - person NickJ; 28.02.2017
comment
ฉันจะเพิ่ม Long countByNameIn(List<String> names); หากสามารถช่วยผู้อื่นได้ เมื่อนับค่าที่แตกต่างกัน - person Jad B.; 16.04.2020

ตราบใดที่คุณไม่ได้ใช้เวอร์ชัน 1.4 คุณสามารถใช้คำอธิบายประกอบที่ชัดเจนได้:

ตัวอย่าง:

@Query("select count(e) from Product e where e.area.code = ?1")
long countByAreaCode(String code);
person Roman    schedule 24.05.2013
comment
โปรดทราบว่าวิธีการควรส่งคืน long แทน int มิฉะนั้นคุณจะได้รับ ClassCastException โดยไม่มีเบาะแสใด ๆ - person Rangi Lin; 21.02.2014

JpaRepository ยังขยาย QueryByExampleExecutor ด้วย ดังนั้นคุณไม่จำเป็นต้องกำหนดวิธีการแบบกำหนดเองบนอินเทอร์เฟซของคุณ:

public interface UserRepository extends JpaRepository<User, Long> {
    // no need of custom method
}

แล้วสอบถามเช่น:

User probe = new User();
u.setName = "John";
long count = repo.count(Example.of(probe));
person L. Holanda    schedule 22.02.2017
comment
เวอร์ชันนี้ฉันชอบมากที่สุด - โดยเฉพาะอย่างยิ่งเนื่องจากฉันไม่สามารถระบุได้ว่าสิ่งนี้ควรทำงานอย่างไรตาม docu :-) คุณช่วยวันของฉันไว้ :-) ตามหมายเหตุ: ดั้งเดิม (เช่น int) จะรวมอยู่ในการค้นหา expamle เช่น int age จะถูกรวมไว้แม้ว่าจะไม่ได้ตั้งค่า แต่ Integer age จะถูกแยกออกจากตัวอย่าง (อย่างน้อยใน Eclipselink) - person LeO; 12.10.2017
comment
นี่คือสิ่งที่ฉันกำลังมองหา ขอบคุณ! - person emrekgn; 07.06.2018

ตัวอย่างการทำงาน

@Repository
public interface TenantRepository extends JpaRepository< Tenant, Long > {
    List<Tenant>findByTenantName(String tenantName,Pageable pageRequest);
    long countByTenantName(String tenantName);
}

กำลังโทรจากเลเยอร์ DAO

@Override
public long countByTenantName(String tenantName) {
    return repository.countByTenantName(tenantName);
}
person Sagar Misal    schedule 23.06.2017

คุณลักษณะนี้ได้ถูกเพิ่มเข้ามาในเวอร์ชัน 1.4 M1

person Abel Pastur    schedule 13.05.2013

เห็นได้ชัดว่ามีการใช้งานแล้วตอนนี้ DATAJPA-231

person chpopov    schedule 16.05.2013

ตามข้อมูลของ Abel หลังจากเวอร์ชัน 1.4 (ทดสอบในเวอร์ชัน 1.4.3.RELEASE) สามารถทำได้ด้วยวิธีนี้:

countByName ยาวสาธารณะ (ชื่อสตริง);

person Marcos Nunes    schedule 22.01.2014

ขอบคุณทุกท่าน! ตอนนี้ก็ทำงานแล้ว DATAJPA-231

คงจะดีไม่น้อยหากสามารถสร้างวิธีการนับ...โดย...เหมือนกับการหา...โดยวิธีต่างๆ ตัวอย่าง:

public interface UserRepository extends JpaRepository<User, Long> {

   public Long /*or BigInteger */ countByActiveTrue();
}
person Thanongsak Chamung    schedule 03.11.2016

ตามปัญหา DATAJPA-231 คุณลักษณะนี้ยังไม่ได้ใช้งาน

person Oleksandr Bondarenko    schedule 11.08.2012
comment
ตอนนี้ได้ดำเนินการแล้ว - person Sergey Ponomarev; 27.02.2019

ฉันเพิ่งใช้งานมันได้ไม่กี่สัปดาห์ แต่ฉันไม่เชื่อว่าสิ่งนี้จะเป็นไปได้อย่างเคร่งครัด แต่คุณควรจะสามารถได้รับผลแบบเดียวกันโดยใช้ความพยายามเพิ่มขึ้นอีกเล็กน้อย เพียงเขียนแบบสอบถามด้วยตัวเองและใส่คำอธิบายประกอบชื่อวิธีการ อาจจะไม่ง่ายไปกว่าการเขียนวิธีการด้วยตัวเองมากนัก แต่ในความคิดของฉันมันสะอาดกว่า

แก้ไข: ตอนนี้เป็นไปได้ตาม DATAJPA-231

person Mark Sholund    schedule 26.05.2012

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

@Query("select count(sl) from SlUrl sl where sl.user =?1 And sl.creationDate between ?2 And ?3")
    long countUrlsBetweenDates(User user, Date date1, Date date2);
person Inzimam Tariq IT    schedule 10.01.2020

person    schedule
comment
ตัวอย่างนี้อยู่นอกหัวข้อ ผู้ใช้ถามถึงวิธีนับชื่อฟิลด์ countBy ไม่ใช่วิธีเรียกการนับพื้นฐานจากบริการ REST - person Jad B.; 16.04.2020