2017-09-04 97 views
1

我有實體活動與以下字段:比較日期的量和JPA與日期詮釋規格

@Temporal(TemporalType.TIMESTAMP) 
@JsonFormat(pattern = DATE_FORMAT) 
private Date start; 

@Column(name = "period_minutes") 
private Integer period; 

我需要這些領域的量與當前的日期時間比較:

SELECT * FROM Event e WHERE (e.start + e.period) < NOW(); 

換句話說,我需要添加到start字段(這是日期)period(例如15)的一些分鐘數並將其與當前日期時間進行比較。我試圖這樣做:

return (root, query, cb) -> { 
    Expression<Long> sum = cb.sum(root.<Date>get("start"), root.get("period")); 
    return cb.lessThan(sum, new Date()); 
}; 

但是,這不會編譯。我不知道如何將日期轉換爲長時間並添加period * 60 * 1000(分鐘 - >毫秒)。如何解決這個問題?

SOLUTION

我有固定與@幫助這個問題Серг0

cb.lessThan(
    cb.sum(
     cb.function("unix_timestamp", Long.class, root.get("start")), 
     cb.prod(root.get("period"), 1L) 
     ), 
    cb.function("unix_timestamp", Long.class, cb.function("now", Long.class)) 
); 

但我不明白爲什麼,如果我用1L它的作品,如果我用60L*1000L(因爲我需要計算幾分鐘內的毫秒數period),它不起作用。

+0

看到http://www.objectdb.com/database/forum/442過去後,我認爲這就是你想要的 – 2017-09-04 16:48:15

回答

1

試試這個:

Specification<Event> predicate = (root, query, cb) -> { 

    Expression<Time> currentTime = cb.currentTime(); 

    return cb.and(
     cb.equal(root.get("start"), cb.currentDate()), // if start date == current date 
     cb.lessThan(// if period < current hour * 60 + current minutes 
      root.get("period"), 
      cb.sum(// current hour * 60 + current minutes 
       cb.prod(cb.function("hour", Integer.class, currentTime), 60), // hours * 60 
       cb.function("minute", Integer.class, currentTime) // current minutes 
      ) 
     ) 
    ); 
}; 

List<Event> events = findAll(predicate); 

附加信息:

Criteria Query Arithmetic Expressions

Date and Time in Criteria Queries

+0

你的意思'開始'和期限爲'root.get(「start」)','root.get(「period」)'?我不明白這種做法 –

+0

@CatHзаменитипjava.util.Dateнаjava.sql.Dateдляполя'start'изаменистроку回報намою,ипроверь,заработаетли... – Cepr0

+0

@CatHПардон,ответнекорректный ,увлекся...)) – Cepr0