✅ Common Spring Data JPA Query Keywords

KeywordMeaningExample Method
And, OrLogical conjunction/disjunctionfindByFirstNameAndLastName
Is, EqualsExact matchfindByEmailIs(String email)
NotNegationfindByFirstNameNot(String name)
In, NotInCollection matchfindByIdIn(List<String> ids)
LikeSQL LIKE, % must be added manuallyfindByEmailLike(String pattern)
ContainsLIKE %x%findByEmailContaining(String part)
StartsWithLIKE x%findByEmailStartingWith(String prefix)
EndsWithLIKE %xfindByEmailEndingWith(String suffix)
IgnoreCaseCase-insensitive matchfindByFirstNameIgnoreCase(String name)
GreaterThan> comparisonfindByAgeGreaterThan(int age)
LessThan< comparisonfindByAgeLessThan(int age)
BetweenRangefindByCreatedAtBetween(start, end)
Before, AfterDate/time comparisonsfindByUpdatedAtAfter(LocalDateTime dt)
IsNull, NotNullCheck for null valuesfindByPhoneNumberIsNull()
True, FalseBoolean flagsfindByActiveTrue()

🧰 Dynamic Queries: Spring Data Specifications

For dynamic filtering (e.g. search by optional fields), use JPA Specifications.

✅ Step 1: Extend JpaSpecificationExecutor

public interface UserRepository extends 
    BaseRepository<User, String>, 
    JpaSpecificationExecutor<User> {
}

✅ Step 2: Create a Specification<User>

public class UserSpecifications {
 
    public static Specification<User> hasFirstName(String name) {
        return (root, query, cb) ->
            cb.equal(root.get("firstName"), name);
    }
 
    public static Specification<User> emailContains(String fragment) {
        return (root, query, cb) ->
            cb.like(cb.lower(root.get("email")), "%" + fragment.toLowerCase() + "%");
    }
}

✅ Step 3: Use It Dynamically

Specification<User> spec = Specification.where(null);
 
if (firstName != null) {
    spec = spec.and(UserSpecifications.hasFirstName(firstName));
}
 
if (emailFragment != null) {
    spec = spec.and(UserSpecifications.emailContains(emailFragment));
}
 
List<User> users = userRepository.findAll(spec);

🚀 When to Use

Use CaseApproach
Simple lookupsMethod naming
Optional/multiple filtersSpecifications
Complex joins, subqueries@Query or Criteria

Let me know if you want:

  • A ready-to-use dynamic UserSearchRequest + filter logic

  • Integration of Specifications in your service layer

  • Paginated dynamic filtering with sorting