2016-12-13 107 views
0

我有了一個NameQuery像這樣的實體:JPA日期比較不工作

@Entity 
@Table(name = "ping") 
@NamedQueries({ 
    @NamedQuery(name = "Ping.getPingsOlderThan", query = "SELECT p FROM Ping p WHERE p.pingTime > :time") 
}) 
public class Ping extends BaseModel implements Serializable{ 
... 

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "ping_time") 
private Date pingTime; 

我稱之爲NamedQuery形式驗證碼:

public List<Ping> getPingsOlderThan(Integer seconds) { 
     Calendar now = Calendar.getInstance(); 
     //make sure seconds is negative, so it subtracts 
     seconds = seconds > 0 ? seconds * -1 : seconds; 
     now.add(Calendar.SECOND, seconds); 
     Date time = now.getTime(); 
     try{ 
      Query query = getEntityManager().createNamedQuery("Ping.getPingsOlderThan"); 
      query.setParameter("time", time); 
      return query.getResultList(); 
     } 
     catch(Exception e){ 
      logger.log(Level.SEVERE, "Could not get pings",e); 
      return null; 
     } 
    } 

基本上它得到所有Pings這是老年人比秒的傳遞(至少那是它應該做的)。所以如果傳入30,它應該在最後30秒內獲得所有Pings。我得到的全部是數據庫中的Pings。即使是那些比我傳入的值還要大的值。

我的查詢有什麼問題嗎?這與我使用java.util.Date這個事實有什麼關係?

+0

當我有一個比較日期的問題時,事實證明日期被插入數據庫時​​被截斷,日期時間總是設置爲午夜。也許這裏發生了類似的事情? – Kerry

+0

我懷疑它與java.util.Date有關。我只會做一個java.sql.Date。只要做'query.setParameter(「time」,new java.sql.Date(time.getTime()));' – Orin

回答

0

我想通了。我不得不將TemporalType傳遞給查詢參數。否則,它使用沒有秒的Date版本。

query.setParameter("time", time,TemporalType.TIMESTAMP);