0Pricing
Java Academy · درس

مستودعات Spring Data وطرائق الاستعلام

وسّع JpaRepository، وعرّف طرائق الاستعلام وفق اصطلاحات التسمية، واستخدم @Query لاستعلامات JPQL المخصصة

مستودعات Spring Data وطرائق الاستعلام درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

مستودعات Spring Data JPA

وسّع JpaRepository<Entity, ID> للحصول مجانًا على أساليب CRUD والترقيم والفرز. ينشئ 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 لكتابة SQL خام. وهذا مفيد لميزات خاصة بقاعدة البيانات مثل 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);

تطبيقات المستودعات المخصصة

أضف طريقة مخصصة بإنشاء واجهة وفئة تطبيق وفق قاعدة التسمية 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 المعقد أو SQL الأصلي. استخدم @Modifying+@Transactional للتحديثات. واستخدم @EntityGraph لضبط الجلب.

الأسئلة الشائعة

هل درس «مستودعات Spring Data وطرائق الاستعلام» مجاني؟

نعم — نص درس «مستودعات Spring Data وطرائق الاستعلام» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «مستودعات Spring Data وطرائق الاستعلام»؟

وسّع JpaRepository، وعرّف طرائق الاستعلام وفق اصطلاحات التسمية، واستخدم @Query لاستعلامات JPQL المخصصة تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «مستودعات Spring Data وطرائق الاستعلام»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ربط الكيانات باستخدام تعليقات JPA
  2. مستودعات Spring Data وطرائق الاستعلام
  3. علاقات واحد-إلى-متعدد ومتعدد-إلى-متعدد
  4. التقسيم إلى صفحات والفرز والإسقاطات
← العودة إلى Java Academy