Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
c358ecd
Merge branch 'eugenp:master' into master
wynnteo May 16, 2024
74f4a8b
Merge branch 'eugenp:master' into master
wynnteo May 23, 2024
12ae4a2
Merge branch 'eugenp:master' into master
wynnteo May 24, 2024
a556cad
Merge branch 'eugenp:master' into master
wynnteo May 28, 2024
e5f3c5a
Merge branch 'eugenp:master' into master
wynnteo May 31, 2024
5b337e9
Merge branch 'eugenp:master' into master
wynnteo Jun 5, 2024
55688c1
Merge branch 'eugenp:master' into master
wynnteo Jun 10, 2024
8b0ca7c
Merge branch 'eugenp:master' into master
wynnteo Jun 11, 2024
6350935
Merge branch 'eugenp:master' into master
wynnteo Jun 16, 2024
d73ca7f
Merge branch 'eugenp:master' into master
wynnteo Jun 23, 2024
45003f6
Merge branch 'eugenp:master' into master
wynnteo Jun 24, 2024
c458ec0
Merge branch 'eugenp:master' into master
wynnteo Jun 25, 2024
3705a63
Merge branch 'eugenp:master' into master
wynnteo Jul 1, 2024
1c782c3
Merge branch 'eugenp:master' into master
wynnteo Jul 2, 2024
f2de90d
Merge branch 'eugenp:master' into master
wynnteo Jul 5, 2024
53dc085
Merge branch 'eugenp:master' into master
wynnteo Jul 8, 2024
d4c19ab
Merge branch 'eugenp:master' into master
wynnteo Jul 10, 2024
ff8cd93
Merge branch 'eugenp:master' into master
wynnteo Jul 15, 2024
29bcb1d
Merge branch 'eugenp:master' into master
wynnteo Jul 16, 2024
16d5163
Merge branch 'eugenp:master' into master
wynnteo Jul 19, 2024
842edf8
Merge branch 'eugenp:master' into master
wynnteo Jul 22, 2024
f132c30
Merge branch 'eugenp:master' into master
wynnteo Jul 24, 2024
ed1c995
Merge branch 'eugenp:master' into master
wynnteo Jul 25, 2024
be344fb
Merge branch 'eugenp:master' into master
wynnteo Aug 6, 2024
541adfb
Merge branch 'eugenp:master' into master
wynnteo Aug 9, 2024
6fd4d5d
Merge branch 'eugenp:master' into master
wynnteo Aug 13, 2024
80a462c
Merge branch 'eugenp:master' into master
wynnteo Aug 15, 2024
55f1987
Merge branch 'eugenp:master' into master
wynnteo Aug 20, 2024
6df4fb8
Merge branch 'eugenp:master' into master
wynnteo Aug 26, 2024
d1e423e
Merge branch 'eugenp:master' into master
wynnteo Sep 5, 2024
7c7354e
Merge branch 'eugenp:master' into master
wynnteo Sep 16, 2024
f434a47
Merge branch 'eugenp:master' into master
wynnteo Sep 19, 2024
4774de0
Merge branch 'eugenp:master' into master
wynnteo Sep 21, 2024
2260623
Merge branch 'eugenp:master' into master
wynnteo Sep 30, 2024
984f427
Merge branch 'eugenp:master' into master
wynnteo Sep 30, 2024
80cbd03
Merge branch 'eugenp:master' into master
wynnteo Oct 3, 2024
22dcaba
Merge branch 'eugenp:master' into master
wynnteo Oct 3, 2024
05494c0
Merge branch 'eugenp:master' into master
wynnteo Oct 10, 2024
0e87d28
Merge branch 'eugenp:master' into master
wynnteo Oct 14, 2024
983608b
Merge branch 'eugenp:master' into master
wynnteo Oct 22, 2024
b37b377
Merge branch 'eugenp:master' into master
wynnteo Oct 29, 2024
dadfb2f
Merge branch 'eugenp:master' into master
wynnteo Nov 1, 2024
ece1b1c
Merge branch 'eugenp:master' into master
wynnteo Nov 7, 2024
319081a
Merge branch 'eugenp:master' into master
wynnteo Nov 8, 2024
ac445aa
Merge branch 'eugenp:master' into master
wynnteo Nov 26, 2024
64c96b9
Merge branch 'eugenp:master' into master
wynnteo Dec 11, 2024
ee18089
Merge branch 'eugenp:master' into master
wynnteo Dec 18, 2024
d32e660
Merge branch 'eugenp:master' into master
wynnteo Dec 19, 2024
c186fdd
Merge branch 'eugenp:master' into master
wynnteo Dec 24, 2024
e216122
Merge branch 'eugenp:master' into master
wynnteo Jan 9, 2025
96f545e
Merge branch 'eugenp:master' into master
wynnteo Jan 20, 2025
b2a8b7b
Merge branch 'eugenp:master' into master
wynnteo Feb 5, 2025
afb1645
Merge branch 'eugenp:master' into master
wynnteo Feb 12, 2025
11308fb
Merge branch 'eugenp:master' into master
wynnteo Feb 21, 2025
76e0935
Merge branch 'eugenp:master' into master
wynnteo Feb 25, 2025
c0fe750
Merge branch 'eugenp:master' into master
wynnteo Feb 28, 2025
80bee83
Merge branch 'eugenp:master' into master
wynnteo Mar 10, 2025
71b8373
Merge branch 'eugenp:master' into master
wynnteo Mar 13, 2025
f8338d0
Merge branch 'eugenp:master' into master
wynnteo Mar 18, 2025
9f78b8e
Merge branch 'eugenp:master' into master
wynnteo Mar 20, 2025
2797cce
Merge branch 'eugenp:master' into master
wynnteo Apr 3, 2025
b180f5b
Merge branch 'eugenp:master' into master
wynnteo Apr 28, 2025
a3e1bdb
Merge branch 'eugenp:master' into master
wynnteo May 2, 2025
32d81a1
Merge branch 'eugenp:master' into master
wynnteo May 14, 2025
05e5bf0
Merge branch 'eugenp:master' into master
wynnteo May 19, 2025
43267b3
Merge branch 'eugenp:master' into master
wynnteo May 22, 2025
bcde467
Merge branch 'eugenp:master' into master
wynnteo May 26, 2025
da3a2cf
Merge branch 'eugenp:master' into master
wynnteo May 28, 2025
4e99905
Merge branch 'eugenp:master' into master
wynnteo Jun 11, 2025
f619b1a
Merge branch 'eugenp:master' into master
wynnteo Jun 20, 2025
a09d7e0
Merge branch 'eugenp:master' into master
wynnteo Jun 23, 2025
47691bb
Merge branch 'eugenp:master' into master
wynnteo Jun 27, 2025
561df5f
Merge branch 'eugenp:master' into master
wynnteo Jul 2, 2025
b13caa4
Merge branch 'eugenp:master' into master
wynnteo Jul 7, 2025
e0ce109
Merge branch 'eugenp:master' into master
wynnteo Jul 25, 2025
65ae2eb
Merge branch 'eugenp:master' into master
wynnteo Aug 7, 2025
6906c51
Merge branch 'eugenp:master' into master
wynnteo Aug 15, 2025
c3700d9
Merge branch 'eugenp:master' into master
wynnteo Aug 18, 2025
8b2c8eb
Merge branch 'eugenp:master' into master
wynnteo Aug 18, 2025
0e5c9f1
Merge branch 'eugenp:master' into master
wynnteo Sep 2, 2025
0287c9e
Merge branch 'eugenp:master' into master
wynnteo Sep 23, 2025
73b99b7
Merge branch 'eugenp:master' into master
wynnteo Sep 29, 2025
3804568
Merge branch 'eugenp:master' into master
wynnteo Oct 17, 2025
8de0493
BAEL-6855
Oct 17, 2025
11a86d8
Test
Oct 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.baeldung.jpa.localdatetimequery;

import jakarta.persistence.*;
import java.time.LocalDateTime;

@Entity
@Table(name = "events")
public class Event {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;

public Event() {}

public Event(String name, LocalDateTime createdAt) {
this.name = name;
this.createdAt = createdAt;
}

@PreUpdate
protected void onUpdate() {
updatedAt = LocalDateTime.now();
}

// Getters and setters
public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public LocalDateTime getCreatedAt() {
return createdAt;
}

public void setCreatedAt(LocalDateTime createdAt) {
this.createdAt = createdAt;
}

public LocalDateTime getUpdatedAt() {
return updatedAt;
}

public void setUpdatedAt(LocalDateTime updatedAt) {
this.updatedAt = updatedAt;
}

@Override
public String toString() {
return "Event{" +
"id=" + id +
", name='" + name + '\'' +
", createdAt=" + createdAt +
", updatedAt=" + updatedAt +
'}';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.baeldung.jpa.localdatetimequery;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

import org.springframework.stereotype.Repository;

import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Root;

@Repository
public class EventCriteriaRepository {

@PersistenceContext
private EntityManager entityManager;

public List<Event> findByCreatedDate(LocalDate date) {
LocalDateTime startOfDay = date.atStartOfDay();
LocalDateTime endOfDay = date.plusDays(1).atStartOfDay();

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Event> cq = cb.createQuery(Event.class);
Root<Event> root = cq.from(Event.class);

cq.select(root).where(
cb.between(root.get("createdAt"), startOfDay, endOfDay)
);

return entityManager.createQuery(cq).getResultList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.baeldung.jpa.localdatetimequery;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

public interface EventRepository extends JpaRepository<Event, Long> {

List<Event> findByCreatedAtBetween(LocalDateTime start, LocalDateTime end);

List<Event> findByCreatedAtGreaterThanEqualAndCreatedAtLessThan(
LocalDateTime start,
LocalDateTime end
);


@Query("SELECT e FROM Event e WHERE FUNCTION('DATE', e.createdAt) = :date")
List<Event> findByDate(@Param("date") LocalDate date);

@Query(
value = "SELECT * FROM events " +
"WHERE created_at >= :startOfDay " +
"AND created_at < :endOfDay",
nativeQuery = true
)
List<Event> findByDateRangeNative(
@Param("startOfDay") LocalDateTime startOfDay,
@Param("endOfDay") LocalDateTime endOfDay
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.baeldung.jpa.localdatetimequery;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class LocalDateTimeQueryApplication {

public static void main(String[] args) {
SpringApplication.run(LocalDateTimeQueryApplication.class, args);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
spring.datasource.url=jdbc:h2:mem:testdb;MODE=MySQL
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=false
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
package com.baeldung.jpa.localdatetimequery;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.context.annotation.Import;

@DataJpaTest
@Import(EventCriteriaRepository.class)
public class EventRepositoryUnitTest {
@Autowired
private EventRepository eventRepository;

@Autowired
private EventCriteriaRepository eventCriteriaRepository;

private LocalDate testDate;

@BeforeEach
public void setUp() {
testDate = LocalDate.of(2025, 10, 12);

eventRepository.deleteAll();

eventRepository.save(new Event("Morning Meeting", LocalDateTime.of(2025, 10, 12, 9, 0, 0)));
eventRepository.save(new Event("Lunch Discussion", LocalDateTime.of(2025, 10, 12, 12, 30, 0)));
eventRepository.save(new Event("Evening Review", LocalDateTime.of(2025, 10, 12, 18, 45, 0)));
eventRepository.save(new Event("Next Day Planning", LocalDateTime.of(2025, 10, 13, 10, 0, 0)));
}
@Test
public void givenLocalDateAndEventsWithTimestamps_whenQueryUsingBetween_thenReturnAllEventsForThatDay() {
LocalDateTime startOfDay = testDate.atStartOfDay();
LocalDateTime endOfDay = testDate.plusDays(1).atStartOfDay();

List<Event> results = eventRepository.findByCreatedAtBetween(startOfDay, endOfDay);

assertEquals(3, results.size());
assertEquals("Morning Meeting", results.get(0).getName());
assertEquals("Lunch Discussion", results.get(1).getName());
assertEquals("Evening Review", results.get(2).getName());
}

@Test
public void givenLocalDateAndEventsWithTimestamps_whenQueryUsingExplicitBoundaries_thenReturnAllEventsForThatDay() {
LocalDateTime startOfDay = testDate.atStartOfDay();
LocalDateTime endOfDay = testDate.plusDays(1).atStartOfDay();

List<Event> results = eventRepository.findByCreatedAtGreaterThanEqualAndCreatedAtLessThan(startOfDay, endOfDay);

assertEquals(3, results.size());
assertEquals("Morning Meeting", results.get(0).getName());
assertEquals("Lunch Discussion", results.get(1).getName());
assertEquals("Evening Review", results.get(2).getName());
}

// @Test
// public void givenLocalDateAndEventsWithTimestamps_whenQueryUsingJpqlDateFunction_thenReturnAllEventsForThatDay() {
// LocalDate queryDate = LocalDate.of(2025, 10, 12);
//
// List<Event> results = eventRepository.findByDate(queryDate);
//
// assertEquals(3, results.size());
// assertEquals("Morning Meeting", results.get(0).getName());
// assertEquals("Lunch Discussion", results.get(1).getName());
// assertEquals("Evening Review", results.get(2).getName());
// }

@Test
public void givenLocalDateAndEventsWithTimestamps_whenQueryUsingCriteriaApi_thenReturnAllEventsForThatDay() {
LocalDate queryDate = LocalDate.of(2025, 10, 12);

List<Event> results = eventCriteriaRepository.findByCreatedDate(queryDate);

assertEquals(3, results.size());
assertEquals("Morning Meeting", results.get(0).getName());
assertEquals("Lunch Discussion", results.get(1).getName());
assertEquals("Evening Review", results.get(2).getName());
}

@Test
public void givenLocalDateAndEventsWithTimestamps_whenQueryUsingNativeSql_thenReturnAllEventsForThatDay() {
LocalDateTime startOfDay = testDate.atStartOfDay();
LocalDateTime endOfDay = testDate.plusDays(1).atStartOfDay();

List<Event> results = eventRepository.findByDateRangeNative(startOfDay, endOfDay);

assertEquals(3, results.size());
assertEquals("Morning Meeting", results.get(0).getName());
assertEquals("Lunch Discussion", results.get(1).getName());
assertEquals("Evening Review", results.get(2).getName());
}

@Test
public void givenLocalDateForDifferentDay_whenQueryUsingBetween_thenReturnOnlyEventForThatDay() {
LocalDate differentDate = LocalDate.of(2025, 10, 13);
LocalDateTime startOfDay = differentDate.atStartOfDay();
LocalDateTime endOfDay = differentDate.plusDays(1).atStartOfDay();

List<Event> results = eventRepository.findByCreatedAtBetween(startOfDay, endOfDay);

assertEquals(1, results.size());
assertEquals("Next Day Planning", results.get(0).getName());
}

@Test
public void givenNoEventsForDate_whenQueryUsingBetween_thenReturnEmptyList() {
LocalDate emptyDate = LocalDate.of(2025, 10, 14);
LocalDateTime startOfDay = emptyDate.atStartOfDay();
LocalDateTime endOfDay = emptyDate.plusDays(1).atStartOfDay();

List<Event> results = eventRepository.findByCreatedAtBetween(startOfDay, endOfDay);

assertEquals(0, results.size());
}
}