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
}