import org.springframework.data.domain.Pageable
import org.springframework.data.jpa.repository.JpaRepository

interface UserRepository : JpaRepository<User, Long> {
    // 1. 데이터 저장
    // INSERT INTO User...
    fun save(user: User): User

    // 2. 데이터 삭제
    // DELETE FROM User WHERE id = ...
    fun deleteById(id: Long)

    // 3. 데이터 조회 (기본 키로 조회)
    // SELECT * FROM User WHERE id = ...
    fun findById(id: Long): User?

    // 4. 모든 데이터 조회
    // SELECT * FROM User
    fun findAll(): List<User>

    // 5. 데이터 개수 조회
    // SELECT COUNT(*) FROM User
    fun count(): Long

    // 6. 데이터 존재 여부 확인
    // SELECT EXISTS(SELECT 1 FROM User WHERE id = ...)
    fun existsById(id: Long): Boolean

    // 7. 데이터 정렬 및 페이징 조회
    // SELECT * FROM User ORDER BY created_at DESC LIMIT ...
    fun findAllByOrderByCreatedAtDesc(pageable: Pageable): List<User>

    // 8. 조건에 따른 데이터 조회
    // SELECT * FROM User WHERE username = ...
    fun findByUsername(username: String): User?

    // 9. 데이터 조회 (페이징)
    // SELECT * FROM User LIMIT ...
    fun findAll(pageable: Pageable): List<User>

    // 10. 조건에 따른 데이터 개수 조회
    // SELECT COUNT(*) FROM User WHERE age = ...
    fun countByAge(age: Int): Long

    // 11. 데이터 삭제 (조건에 따라)
    // DELETE FROM User WHERE username = ...
    fun deleteByUsername(username: String)

    // 12. 특정 필드로 데이터 조회
    // SELECT * FROM User WHERE email = ...
    fun findByEmail(email: String): List<User>

    // 13. 데이터 정렬 및 페이징 조회 (조건에 따라)
    // SELECT * FROM User WHERE age > ... ORDER BY created_at DESC LIMIT ...
    fun findByAgeGreaterThanOrderByCreatedAtDesc(age: Int, pageable: Pageable): List<User>

    // 14. 범위 조회
    // SELECT * FROM User WHERE age BETWEEN ... AND ...
    fun findByAgeBetween(minAge: Int, maxAge: Int): List<User>

    // 15. 데이터 존재 여부 확인 (조건에 따라)
    // SELECT EXISTS(SELECT 1 FROM User WHERE username = ...)
    fun existsByUsername(username: String): Boolean

    // 16. 특정 필드로 데이터 개수 조회
    // SELECT COUNT(*) FROM User WHERE email = ...
    fun countByEmail(email: String): Long

    // 17. 데이터 조회 (조건에 따라 정렬)
    // SELECT * FROM User WHERE age = ... ORDER BY username
    fun findByAgeOrderByUsername(age: Int): List<User>

    // 18. 데이터 조회 (여러 조건으로)
    // SELECT * FROM User WHERE username = ... AND age = ...
    fun findByUsernameAndAge(username: String, age: Int): List<User>

    // 19. 데이터 조회 (OR 조건)
    // SELECT * FROM User WHERE username = ... OR email = ...
    fun findByUsernameOrEmail(username: String, email: String): List<User>

    // 20. 데이터 조회 (IN 조건)
    // SELECT * FROM User WHERE age IN (...)
    fun findByAgeIn(ages: List<Int>): List<User>

    // 21. 데이터 조회 (NOT 조건)
    // SELECT * FROM User WHERE age <> ...
    fun findByAgeNot(age: Int): List<User>

    // 22. 데이터 조회 (IgnoreCase)
    // SELECT * FROM User WHERE lower(username) = lower(...)
    fun findByUsernameIgnoreCase(username: String): List<User>

    // 23. 데이터 조회 (조건에 따라 Limit 적용)
    // SELECT * FROM User ORDER BY age DESC LIMIT ...
    fun findTop3ByOrderByAgeDesc(): List<User>

    // 24. 데이터 조회 (조건에 따라 Limit 적용)
    // SELECT * FROM User ORDER BY created_at DESC LIMIT ...
    fun findFirst2ByOrderByCreatedAtDesc(): List<User>

    // 25. 데이터 조회 (조건에 따라 특정 필드만 가져오기)
    // SELECT username FROM User WHERE age > ...
    fun findUsernamesByAgeGreaterThan(age: Int): List<String>

    // 26. 데이터 조회 (Named Parameter 사용)
    // SELECT * FROM User WHERE username = :username
    fun findByUsernameIs(@Param("username") username: String): User?

    // 27. 데이터 조회 (여러 조건으로)
    // SELECT * FROM User WHERE username = ... AND age > ...
    fun findByUsernameAndAgeGreaterThan(username: String, age: Int): List<User>

    // 28. 데이터 조회 (OR 조건)
    // SELECT * FROM User WHERE (username = ... OR email = ...) AND age > ...
    fun findByUsernameOrEmailAndAgeGreaterThan(username: String, email: String, age: Int): List<User>

    // 29. 데이터 조회 (IN 조건)
    // SELECT * FROM User WHERE age IN (...)
    fun findByAgeIn(ages: List<Int>): List<User>

    // 30. 데이터 조회 (NOT 조건)
    // SELECT * FROM User WHERE age <> ...
    fun findByAgeNotIn(age: Int): List<User>

    // 31. 데이터 조회 (IgnoreCase)
    // SELECT * FROM User WHERE LOWER(username) = LOWER(...)
    fun findByUsernameIgnoreCase(username: String): List<User>

    // 32. 데이터 조회 (Limit 적용)
    // SELECT * FROM User ORDER BY age DESC LIMIT 3
    fun findFirst3ByOrderByAgeDesc(): List<User>

    // 33. 데이터 조회 (Limit 적용)
    // SELECT * FROM User ORDER BY created_at DESC LIMIT 2
    fun findTop2ByOrderByCreatedAtDesc(): List<User>

    // 34. 데이터 조회 (조건에 따라 정렬, 페이징)
    // SELECT * FROM User WHERE age = ... ORDER BY created_at DESC LIMIT ...
    fun findByAgeOrderByCreatedAtDesc(age: Int, pageable: Pageable): List<User>

    // 35. 데이터 조회 (특정 필드로 정렬)
    // SELECT * FROM User WHERE age = ... ORDER BY email
    fun findByAgeOrderByEmail(age: Int): List<User>

    // 36. 데이터 조회 (여러 조건으로, 정렬)
    // SELECT * FROM User WHERE username = ... AND age = ... ORDER BY created_at DESC
    fun findByUsernameAndAgeOrderByCreatedAtDesc(username: String, age: Int): List<User>

    // 37. 데이터 조회 (OR 조건, 정렬)
    // SELECT * FROM User WHERE (username = ... OR email = ...) ORDER BY created_at DESC
    fun findByUsernameOrEmailOrderByCreatedAtDesc(username: String, email: String): List<User>

    // 38. 데이터 조회 (IN 조건, 정렬)
    // SELECT * FROM User WHERE age IN (...) ORDER BY created_at DESC
    fun findByAgeInOrderByCreatedAtDesc(ages: List<Int>): List<User>

    // 39. 데이터 조회 (Limit 및 정렬)
    // SELECT * FROM User ORDER BY age ASC LIMIT 3
    fun findTop3ByOrderByAgeAsc(): List<User>

    // 40. 데이터 조회 (Limit 및 정렬)
    // SELECT * FROM User ORDER BY created_at ASC LIMIT 2
    fun findFirst2ByOrderByCreatedAtAsc(): List<User>
    
    // 41. 가장 최근 1개 데이터 조회 (Limit 및 정렬)
    // SELECT * FROM User WHERE code = ... ORDER BY created_at DESC LIMIT 1
    fun findFirstByCodeOrderByCreatedAtDesc(code: String): User
}

 

 

 

 

 

+ Recent posts