0Pricing
Java Academy · บทเรียน

รีโพซิทอรี 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การแมปเอนทิตีด้วยคำอธิบาย JPA
  2. รีโพซิทอรี Spring Data และเมธอดค้นหา
  3. ความสัมพันธ์แบบหนึ่งต่อกลุ่มและกลุ่มต่อกลุ่ม
  4. การแบ่งหน้า การเรียงลำดับ และโปรเจกชัน
← กลับไปที่ Java Academy