Spring Data JPAรองรับเอนทิตีการนับโดยใช้ข้อมูลจำเพาะ แต่มีวิธีใดบ้างในการนับเอนทิตีโดยใช้วิธีการแก้ไขชื่อ? สมมติว่าฉันต้องการวิธีcountByName
การนับเอนทิตีด้วยชื่อเฉพาะเช่นเดียวกับวิธีfindByName
การดึงเอนทิตีทั้งหมดที่มีชื่อเฉพาะ
Spring Data JPAรองรับเอนทิตีการนับโดยใช้ข้อมูลจำเพาะ แต่มีวิธีใดบ้างในการนับเอนทิตีโดยใช้วิธีการแก้ไขชื่อ? สมมติว่าฉันต้องการวิธีcountByName
การนับเอนทิตีด้วยชื่อเฉพาะเช่นเดียวกับวิธีfindByName
การดึงเอนทิตีทั้งหมดที่มีชื่อเฉพาะ
คำตอบ:
ในSpring Data 1.7.1 ปล่อยคุณสามารถทำได้ด้วยสองวิธีที่แตกต่างกัน
1) วิธีใหม่โดยใช้การสืบหาการสืบค้นสำหรับทั้งการนับและการลบแบบสอบถาม อ่านสิ่งนี้ (ตัวอย่างที่ 5) ตัวอย่าง,
public interface UserRepository extends CrudRepository<User, Integer> {
Long countByName(String name);
}
2) วิธีเก่าโดยใช้คำอธิบายประกอบ @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);
}
ตรวจสอบคำตอบด้วย
ตราบใดที่คุณไม่ได้ใช้เวอร์ชัน 1.4 คุณสามารถใช้คำอธิบายประกอบที่ชัดเจนได้:
ตัวอย่าง:
@Query("select count(e) from Product e where e.area.code = ?1")
long countByAreaCode(String code);
long
แทนint
มิฉะนั้นคุณจะได้รับ ClassCastException โดยไม่มีเบาะแสใด ๆ
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)
คุณลักษณะนี้ได้รับการเพิ่มในเวอร์ชัน 1.4 M1
ตัวอย่างการทำงาน
@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);
}
ตาม Abel หลังจากเวอร์ชัน 1.4 (ทดสอบในเวอร์ชัน 1.4.3.RELEASE) สามารถทำได้ด้วยวิธีนี้:
สาธารณะยาว countByName (ชื่อสตริง);
เห็นได้ชัดว่ามีการใช้งานแล้วในขณะนี้DATAJPA-231
ขอบคุณทุกคน! ตอนนี้ก็ทำงานแล้ว DATAJPA-231
จะเป็นการดีถ้าสามารถสร้างจำนวน ... โดย ... วิธีการเช่นเดียวกับการค้นหา ... โดยคน ตัวอย่าง:
public interface UserRepository extends JpaRepository<User, Long> {
public Long /*or BigInteger */ countByActiveTrue();
}
ฉันทำงานกับมันได้เพียงไม่กี่สัปดาห์ แต่ฉันไม่เชื่อว่าสิ่งนี้จะเป็นไปได้อย่างเคร่งครัดอย่างไรก็ตามคุณควรจะได้รับผลแบบเดียวกันนี้ด้วยความพยายามอีกเล็กน้อย เพียงแค่เขียนแบบสอบถามด้วยตัวคุณเองและใส่คำอธิบายประกอบชื่อวิธีการ อาจจะไม่ง่ายไปกว่าการเขียนวิธีการด้วยตัวเอง แต่มันสะอาดกว่าในความคิดของฉัน
แก้ไข: ขณะนี้เป็นไปได้ตามDATAJPA-231
@Autowired
private UserRepository userRepository;
@RequestMapping("/user/count")
private Long getNumberOfUsers(){
return userRepository.count();
}
หากใครต้องการรับการนับโดยอิงตามเงื่อนไขต่างๆมากกว่าที่นี่คือตัวอย่างแบบสอบถามที่กำหนดเอง
@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);