我有一个像NameQuery
这样的实体:
@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 :(得分:0)
我明白了。我必须将TemporalType
传递给查询参数。否则,它使用的Date
版本没有秒。
query.setParameter("time", time,TemporalType.TIMESTAMP);