Skip to main content

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

KeywordExampleGenerated SQL
AndfindByNameAndEmailWHERE name = ? AND email = ?
OrfindByNameOrEmailWHERE name = ? OR email = ?
GreaterThanfindByAgeGreaterThanWHERE age > ?
LessThanfindByAgeLessThanWHERE age < ?
BetweenfindByAgeBetweenWHERE age BETWEEN ? AND ?
LikefindByNameLikeWHERE name LIKE ?
ContainingfindByNameContainingWHERE name LIKE %?%
StartingWithfindByNameStartingWithWHERE name LIKE ?%
EndingWithfindByNameEndingWithWHERE name LIKE %?
OrderBy...AscfindAllByOrderByNameAscORDER BY name ASC
OrderBy...DescfindAllByOrderByNameDescORDER 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