Spring Data JPA Repository Creator
Instructions
The following are key principles to follow while creating Spring Data JPA Repositories:
- •Make sure to create the recommended package structure for Spring Boot projects
- •Create repositories only for aggregate roots
- •Use
@Querywith JPQL for custom queries - •Prefer meaningful method names over long Spring Data JPA finder methods
- •Use constructor expressions or Projections for read operations
- •Use default methods for convenience operations
Example: EventRepository
File: events/domain/EventRepository.java
java
interface EventRepository extends JpaRepository<EventEntity, EventId> {
@Query("""
SELECT e FROM EventEntity e
WHERE e.startDatetime > :now
ORDER BY e.startDatetime ASC
""")
List<EventEntity> findUpcomingEvents(@Param("now") Instant now);
@Query("""
SELECT e FROM EventEntity e
WHERE e.code = :code
""")
Optional<EventEntity> findByCode(@Param("code") EventCode code);
// Convenience methods using default interface methods
default EventEntity getByCode(EventCode eventCode) {
return this.findByCode(eventCode)
.orElseThrow(() -> new ResourceNotFoundException("Event not found with code: " + eventCode));
}
}
Enable JPA Auditing
Enable JPA Auditing support to automatically populate createdAt and updatedAt fields.
- •Add
@CreatedDateand@LastModifiedDateannotations to yourBaseEntityclass. - •Add
@EntityListeners(AuditingEntityListener.class)to yourBaseEntityclass. - •Create a Spring
@Configurationclass and add@EnableJpaAuditingannotation.
java
package dev.sivalabs.meetup4j.shared;
import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.time.Instant;
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
@Column(name = "created_at", nullable = false, updatable = false)
@CreatedDate
protected Instant createdAt;
@Column(name = "updated_at", nullable = false)
@LastModifiedDate
protected Instant updatedAt;
// Getters and setters
}
Enable JPA Auditing in your application configuration:
java
@Configuration
@EnableJpaAuditing
public class JpaConfig {
}