Repositories
Advanced repository patterns and best practices.
Basic Repository Interface
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// Built-in methods: save, findById, findAll, delete, count, etc.
}
Method Name Query Generation
Sproogy generates queries from method names:
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
// SELECT * FROM users WHERE username = ?
Optional<User> findByUsername(String username);
// SELECT * FROM users WHERE age > ?
List<User> findByAgeGreaterThan(int age);
// SELECT * FROM users WHERE username = ? AND active = ?
Optional<User> findByUsernameAndActive(String username, boolean active);
// SELECT * FROM users WHERE email LIKE %?%
List<User> findByEmailContaining(String emailPart);
// SELECT * FROM users ORDER BY created_at DESC
List<User> findAllByOrderByCreatedAtDesc();
// DELETE FROM users WHERE status = ?
@Transactional
void deleteByStatus(String status);
// SELECT COUNT(*) FROM users WHERE active = ?
long countByActive(boolean active);
}
Supported Keywords
| Keyword | Example | Generated SQL |
|---|---|---|
And | findByNameAndEmail | WHERE name = ? AND email = ? |
Or | findByNameOrEmail | WHERE name = ? OR email = ? |
GreaterThan | findByAgeGreaterThan | WHERE age > ? |
LessThan | findByAgeLessThan | WHERE age < ? |
Between | findByAgeBetween | WHERE age BETWEEN ? AND ? |
Like | findByNameLike | WHERE name LIKE ? |
Containing | findByNameContaining | WHERE name LIKE %?% |
StartingWith | findByNameStartingWith | WHERE name LIKE ?% |
EndingWith | findByNameEndingWith | WHERE name LIKE %? |
OrderBy...Asc | findAllByOrderByNameAsc | ORDER BY name ASC |
OrderBy...Desc | findAllByOrderByNameDesc | ORDER BY name DESC |
Custom Queries
For complex queries, use @Query:
@Query("SELECT u FROM User u WHERE u.createdAt > :date ORDER BY u.createdAt DESC")
List<User> findRecentUsers(@Param("date") Date date);
See Queries for more examples.
Best Practices
✅ Use method names for simple queries
✅ Use @Query for complex queries
✅ Return Optional<T> for single results that might not exist
✅ Use @Transactional for delete/update methods
Next Steps
👉 Custom Queries - Write JPQL and native SQL 👉 Transactions - Manage transactions properly