date comparison in JPQL - java

I have a comparison of two dates in my application code. The code is in Flutter, but is easy, so you can understand it even if you donĀ“t know Dart:
selectedDayCalendar.isAfter(item.canceledDate.add(Duration(days: 15)))
Here I want to know when the date selected in Calendar is after other date + 15 days. The problem is:
data can only be shown when date 1 is before or on the same day as date 2 (+ 15 days). If I do this validation in the application, the API will still bring data that I will not use, so I wanted to do this validation in the API itself. The API can only bring in data where:
!selectedDayCalendar.isAfter(item.canceledDate.add(Duration(days: 15)))
How I can do this validation in JPQL Query SELECT?

JPQL doesn't support adding days to a date sadly, so you'll have to use a native query:
SELECT e FROM Item e WHERE DATEADD(DAY, 15, e.canceledDate) < CURRENT_DATE
I think something like that.
But some people don't like the mix of using native and JPQL queries combined.

RESOLVED:
I put Instant.now() in a local variable, then I created another one with instant.now() + 15 days. I passed these two variables by parameter to the function JPQL Query.
it was like this:
Instant startDate = Instant.now();
Instant endDate = startDate.plus(15, ChronoUnit.DAYS);
return eventService.findByTrainerLoginCanceledDateBetween(startDate, endDate);
and JPQL:
#Query(
"SELECT e " +
"FROM Event e " +
"WHERE e.status = '' OR e.canceledDate BETWEEN :startDate AND :endDate"
)
List<Event> findEventByLoginAndCanceledDateBetween(Instant startDate, Instant endDate);

Related

Substract years from current_date in JPQL

I want to delete the rows which are older than 2 years. In SQL I do it like this:
DELETE FROM table WHERE creation_date < (current_date - interval '2 year');
Now I want to do the same for my JPA Repository in Java with the JPQL.
In JPQL I get an error because interval is not known and the "-"(minus) is not correct.
JPQL Query
#Query("DELETE FROM table t WHERE t.creation_date < (current_date - interval '2 year')")
I would appreciate any suggestion.
You can calculate the dateTime in the application, assuming you are using LocalDateTime for creation_date
LocalDateTime dateTime = LocalDateTime.now().minus(Period.ofYears(2));
and pass the parameter in JPQL
#Query("DELETE FROM table t WHERE t.creation_date < :dateTime")
void deleteByDateTime(LocalDateTime dateTime)

get missing dates from a date column in a table darby apache db

I have a table name as 'h1' with field as 'date'. How do I get missing dates in this table using Darby query
DATA IN TABLE h1
date
------------
2018-03-10
2018-03-11
2018-03-13
2018-03-14
2018-03-16
Expected Result is missing dates: 2018-03-12 ,2018-03-15
I've tried every thing on blogs but nothing found properly working.
If you're just looking for a query, something like this might work.
SELECT sq.nextday AS missingday
FROM
(SELECT date1.dates AS currentdate,
date1.dates + INTERVAL 1 DAY AS nextday,
date2.dates AS actualnextday
FROM h1 date1
LEFT JOIN h1 date2 ON date2.dates = date1.dates + INTERVAL 1 DAY) sq
WHERE sq.actualnextday IS NULL HAVING max(sq.currentdate) > sq.nextday;

Spring Data #Query - How to get current date + day

I would like to get records that have date_time column is in a week from now, in a month from now
I have a query like this
public interface BookingRepository extends JpaRepository<Booking, Long> {
#Query("SELECT b " +
"FROM BOOKING b " +
"WHERE b.date_time < NOW() + INTERVAL 7 DAY and b.date_time > NOW()")
List<Booking> getListBooking();
}
In MySQL, NOW() + INTERVAL 7 DAY is working but in JPA #Query, I don't know which function is correspond to it.
In this situation, I have to use dynamic query instead of native query. So I'd like to use dynamic query and face this problem.
Please help.
Thank you!
there is no date_add in JPA so you would have few options:
use native query https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#_native_queries
implement custom jpa function for date modifications
parametrize query
personally i would go with query parametrization as it is easier to test and maintain in the long-run.

How to use date_format when using JPQL/JPA

I am doing Java EE with MySQL as database and implementing JPA on my codes.
I have no problem retrieving the data from MySQL Workbench but when I change my syntax to JPQL's it does not work.
For e.g. in MySQL - it works
SELECT date_format(s.date,'%Y, %m, %d') from Transactions s;
in JPQL - it does not
SELECT date_format(s.date,'%Y, %m, %d') from TransactionEntity s;
How do i modify to suit the JPA query?
Note:
in JPQL the following works
SELECT s.date from TransactionEntity s;
SQL function date_format is not part of JPQL, as any documentation would tell you, so don't see the point in just pushing SQL into JPQL and expecting it to work.
What you can do with JPA 2.1 is invoke it as follows
function("date_format", s.date, '%Y, %m, %d')
where function is a way to invoke any native SQL function. This clearly means you lose database independence because that function is not valid on all datastores.
Sql function is available in JPQL. My JPA version is 1.11.9. Sample group by day query:
#Query(value = "SELECT count(ac) as count, function('date_format', max(ac.subscriptionStartDate), '%Y, %m, %d') as date FROM MyTable ac " +
"WHERE ac.subscriptionStartDate BETWEEN :startDate AND :endDate GROUP BY function('date_format', ac.subscriptionStartDate, '%Y, %m, %d')")
public List<Map<String,Object>> findRegisteredCustomersHistory(#Param("startDate") Date startDate, #Param("endDate") Date endDate);
The result of the query is the list that records the number of records grouped by days in formatted form.
Sample rows:
count: 3, date: 2019, 09, 10
count: 1, date: 2019, 09, 11
for your question, try this in JPQL:
#Query(value = "SELECT function('date_format', s.date, '%Y, %m, %d') as date from Transactions s;")

JPQL Check greater than less than date today in #Query annotation

I want to check weather validTill date is greater than today using JPQL. I know that I can achieve this by following.
Query q = em.createQuery("select e from MyEntity e where e.validTill > :today ");
and pass the :today parameter. But this is not I wanted. I want to do this using #Query annotation in the CrudRepository in Spring.
This is my code segment in the CrudRepository
#Query("SELECT e FROM MyEntity e WHERE e.validFrom < TODAY")
Iterable<MyEntity> findAllValid();
I don't know what I should put at the place TODAY to get the today's date. Please help me.
I found it. it's like this..
#Query("SELECT e FROM MyEntity e WHERE e.validFrom < CURRENT_DATE")
Iterable<MyEntity> findAllValid();
CURRENT_DATE - is evaluated to the current date (a java.sql.Date instance).
CURRENT_TIME - is evaluated to the current time (a java.sql.Time instance).
CURRENT_TIMESTAMP - is evaluated to the current timestamp, i.e. date and time
(a java.sql.Timestamp instance).

Categories

Resources