รีโพซิทอรี Spring Data และเมธอดค้นหา
สืบทอดจาก JpaRepository กำหนดเมธอดค้นหาตามหลักการตั้งชื่อ และใช้ @Query สำหรับ JPQL แบบกำหนดเอง
รีโพซิทอรี Spring Data และเมธอดค้นหา เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
รีโพซิทอรีของ Spring Data JPA
ขยาย JpaRepository<Entity, ID> เพื่อรับเมธอดสำหรับการสร้าง อ่าน ปรับปรุง ลบ การแบ่งหน้า และการเรียงลำดับโดยไม่ต้องเขียนเอง Spring จะสร้างการนำไปใช้งานให้เมื่อเริ่มต้นระบบ จึงไม่ต้องเขียน SQL หรือโค้ดโครงร่างของ DAO
public interface UserRepository extends JpaRepository<User, Long> {
// Free: findAll, findById, save, delete, count, existsById, etc.
}เมธอดคำค้นที่สร้างจากชื่อ
Spring Data จะสร้างคำค้นจากชื่อเมธอด โดยใช้รูปแบบการตั้งชื่อดังนี้: findBy + พร็อพเพอร์ตี + เงื่อนไขเพิ่มเติมที่อาจมี
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByStatus(UserStatus status);
Optional<User> findByEmail(String email);
List<User> findByAgeGreaterThanAndStatusOrderByNameAsc(int age, UserStatus s);
boolean existsByEmail(String email);
long countByStatus(UserStatus status);
}คำสำคัญที่รองรับในชื่อเมธอด
คำสำคัญในการตั้งชื่อ ได้แก่ And, Or, Is/Equals, Between, LessThan/GreaterThan, Like/NotLike, In/NotIn, IsNull/IsNotNull, OrderBy และ First/Top
List<User> findTop5ByStatusOrderByCreatedAtDesc(UserStatus s);
List<User> findByNameContainingIgnoreCase(String fragment);
List<User> findByCreatedAtBetween(LocalDateTime from, LocalDateTime to);@Query สำหรับ JPQL แบบกำหนดเอง
ใช้ @Query สำหรับคำค้นที่ซับซ้อนและไม่สามารถแสดงด้วยชื่อเมธอดได้ JPQL ใช้ชื่อคลาสเอนทิตีและฟิลด์ ไม่ใช่ชื่อตารางหรือชื่อคอลัมน์
@Query("SELECT u FROM User u WHERE u.email = :email AND u.status = :status")
Optional<User> findActiveByEmail(@Param("email") String email,
@Param("status") UserStatus status);
@Query("SELECT u.name, COUNT(o) FROM User u JOIN u.orders o GROUP BY u.name")
List<Object[]> countOrdersPerUser();คำค้นแบบเนทีฟ
ใช้ nativeQuery = true เพื่อเขียนเอสคิวแอลดิบ เหมาะสำหรับความสามารถเฉพาะของฐานข้อมูล เช่น ON CONFLICT, ฟังก์ชันหน้าต่าง หรือการค้นหาข้อความเต็ม
@Query(value = "SELECT * FROM users WHERE tsv @@ plainto_tsquery(:q)",
nativeQuery = true)
List<User> fullTextSearch(@Param("q") String query);การปรับเปลี่ยนคำค้นด้วย @Modifying
กำกับคำค้นสำหรับการปรับปรุงหรือลบด้วย @Modifying และเพิ่ม @Transactional เนื่องจากคำค้นที่ปรับเปลี่ยนข้อมูลต้องทำงานภายในธุรกรรมที่กำลังทำงานอยู่
@Modifying
@Transactional
@Query("UPDATE User u SET u.status = :s WHERE u.lastLogin < :cutoff")
int deactivateInactiveUsers(@Param("s") UserStatus s,
@Param("cutoff") LocalDateTime cutoff);เมธอดการลบที่สร้างจากชื่อ
Spring Data ยังสร้างคำค้นสำหรับการลบจากชื่อเมธอดได้ด้วย ซึ่งสะดวกสำหรับการดำเนินการล้างข้อมูล
void deleteByStatus(UserStatus status);
long deleteByCreatedAtBefore(LocalDateTime cutoff);ส่วนย่อยของรีโพซิทอรี: CrudRepository, PagingAndSortingRepository
ใช้อินเทอร์เฟซพื้นฐานที่แคบกว่าเมื่อไม่ต้องการเมธอดทั้งหมดของ JpaRepository โดย CrudRepository มีการดำเนินการ CRUD พื้นฐาน ส่วน PagingAndSortingRepository เพิ่ม findAll(Pageable)
public interface ReadOnlyUserRepository extends PagingAndSortingRepository<User, Long> {
// Only paging + sorting — no save/delete
}@EntityGraph สำหรับเพิ่มประสิทธิภาพการดึงข้อมูล
ใช้ @EntityGraph เพื่อเขียนทับกลยุทธ์การดึงข้อมูลเริ่มต้นสำหรับแต่ละคำค้น โดยโหลดความสัมพันธ์ล่วงหน้าโดยไม่ต้องเปลี่ยนการแมปของเอนทิตี
@EntityGraph(attributePaths = {"orders", "orders.items"})
@Query("SELECT u FROM User u WHERE u.id = :id")
Optional<User> findWithOrders(@Param("id") Long id);การนำรีโพซิทอรีแบบกำหนดเองไปใช้งาน
เพิ่มเมธอดแบบกำหนดเองโดยสร้างอินเทอร์เฟซและคลาส impl ตามรูปแบบการตั้งชื่อ UserRepositoryCustom + UserRepositoryCustomImpl จากนั้น Spring จะรวมทั้งสองส่วนเข้าด้วยกัน
public interface UserRepositoryCustom {
List<User> searchByCriteria(UserSearchCriteria criteria);
}
public class UserRepositoryCustomImpl implements UserRepositoryCustom {
@PersistenceContext EntityManager em;
public List<User> searchByCriteria(UserSearchCriteria c) {
// use Criteria API or JdbcTemplate
}
}
public interface UserRepository extends JpaRepository<User,Long>, UserRepositoryCustom {}ตรวจสอบความเข้าใจอย่างรวดเร็ว
คำอธิบายประกอบใดที่ต้องใช้ร่วมกับ @Query สำหรับคำสั่ง UPDATE/DELETE
ทบทวน
ขยาย JpaRepository เพื่อรับการดำเนินการ CRUD โดยไม่ต้องเขียนเอง ใช้ชื่อเมธอดที่สร้างคำค้นได้สำหรับคำค้นง่าย ๆ ใช้ @Query สำหรับ JPQL ที่ซับซ้อนหรือเอสคิวแอลเนทีฟ ใช้ @Modifying+@Transactional สำหรับการปรับปรุงข้อมูล และใช้ @EntityGraph เพื่อปรับการดึงข้อมูล
คำถามที่พบบ่อย
บทเรียน “รีโพซิทอรี Spring Data และเมธอดค้นหา” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “รีโพซิทอรี Spring Data และเมธอดค้นหา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “รีโพซิทอรี Spring Data และเมธอดค้นหา”
สืบทอดจาก JpaRepository กำหนดเมธอดค้นหาตามหลักการตั้งชื่อ และใช้ @Query สำหรับ JPQL แบบกำหนดเอง คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “รีโพซิทอรี Spring Data และเมธอดค้นหา” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การแมปเอนทิตีด้วยคำอธิบาย JPA
- รีโพซิทอรี Spring Data และเมธอดค้นหา
- ความสัมพันธ์แบบหนึ่งต่อกลุ่มและกลุ่มต่อกลุ่ม
- การแบ่งหน้า การเรียงลำดับ และโปรเจกชัน