Spring Data JPA รองรับเอนทิตีการนับโดยใช้ข้อกำหนดเฉพาะ แต่มันมีวิธีใดบ้างในการนับเอนทิตีโดยใช้การแก้ไขชื่อวิธีการ? สมมติว่าฉันต้องการวิธี countByName
เพื่อนับเอนทิตีที่มีชื่อเฉพาะ เช่นเดียวกับวิธี findByName
เพื่อดึงข้อมูลเอนทิตีทั้งหมดที่มีชื่อเฉพาะ
Spring Data JPA มีวิธีใดในการนับเอนทิตีโดยใช้การแก้ไขชื่อวิธีการหรือไม่
คำตอบ (12)
ใน Spring Data 1.7.1.RELEASE คุณสามารถทำได้ด้วยสองวิธีที่แตกต่างกัน
- วิธีใหม่ โดยใช้การสืบค้นมาสำหรับการนับและการลบการสืบค้น อ่านสิ่งนี้ ( ตัวอย่างที่ 5) ตัวอย่าง,
public interface UserRepository extends CrudRepository<User, Integer> {
long countByName(String name);
}
- วิธีเก่า การใช้คำอธิบายประกอบ
@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);
}
ตรวจสอบคำตอบนี้ด้วย
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);
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));
int age
จะถูกรวมไว้แม้ว่าจะไม่ได้ตั้งค่า แต่ Integer age
จะถูกแยกออกจากตัวอย่าง (อย่างน้อยใน Eclipselink)
- person LeO; 12.10.2017
ตัวอย่างการทำงาน
@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);
}
คุณลักษณะนี้ได้ถูกเพิ่มเข้ามาในเวอร์ชัน 1.4 M1
ตามข้อมูลของ Abel หลังจากเวอร์ชัน 1.4 (ทดสอบในเวอร์ชัน 1.4.3.RELEASE) สามารถทำได้ด้วยวิธีนี้:
countByName ยาวสาธารณะ (ชื่อสตริง);
ขอบคุณทุกท่าน! ตอนนี้ก็ทำงานแล้ว DATAJPA-231
คงจะดีไม่น้อยหากสามารถสร้างวิธีการนับ...โดย...เหมือนกับการหา...โดยวิธีต่างๆ ตัวอย่าง:
public interface UserRepository extends JpaRepository<User, Long> {
public Long /*or BigInteger */ countByActiveTrue();
}
ตามปัญหา DATAJPA-231 คุณลักษณะนี้ยังไม่ได้ใช้งาน
ฉันเพิ่งใช้งานมันได้ไม่กี่สัปดาห์ แต่ฉันไม่เชื่อว่าสิ่งนี้จะเป็นไปได้อย่างเคร่งครัด แต่คุณควรจะสามารถได้รับผลแบบเดียวกันโดยใช้ความพยายามเพิ่มขึ้นอีกเล็กน้อย เพียงเขียนแบบสอบถามด้วยตัวเองและใส่คำอธิบายประกอบชื่อวิธีการ อาจจะไม่ง่ายไปกว่าการเขียนวิธีการด้วยตัวเองมากนัก แต่ในความคิดของฉันมันสะอาดกว่า
แก้ไข: ตอนนี้เป็นไปได้ตาม DATAJPA-231
หากใครต้องการรับการนับตามเงื่อนไขหลายข้อ นี่คือตัวอย่างแบบสอบถามที่กำหนดเอง
@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);