Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 时间戳的时间部分过滤器不';t工作(JPA2,HIBERNATE)_Java_Sql_Hibernate_Jpa - Fatal编程技术网

Java 时间戳的时间部分过滤器不';t工作(JPA2,HIBERNATE)

Java 时间戳的时间部分过滤器不';t工作(JPA2,HIBERNATE),java,sql,hibernate,jpa,Java,Sql,Hibernate,Jpa,我想按时间戳的时间部分进行过滤。 我将JPA2与hibernate和oracle数据库一起使用。我必须编写一个JPA查询,它返回实体,“std”属性的时间部分高于参数的时间部分。 我无法更改数据库端,也无法使用本机查询 例如,我想搜索std时间大于12:01的所有实体。所以我把这个日期参数放在我的JPA查询中:2013-11-11T12:01:01,但是什么都没有发生,结果列表包含带有std参数(11:00)2013-12-13T11:00:00的元素 我的查询如下所示: Query q = e

我想按时间戳的时间部分进行过滤。 我将JPA2hibernateoracle数据库一起使用。我必须编写一个JPA查询,它返回实体,“std”属性的时间部分高于参数的时间部分。 我无法更改数据库端,也无法使用本机查询

例如,我想搜索std时间大于12:01的所有实体。所以我把这个日期参数放在我的JPA查询中:2013-11-11T12:01:01,但是什么都没有发生,结果列表包含带有std参数(11:00)2013-12-13T11:00:00的元素

我的查询如下所示:

Query q = em.createQuery( "SELECT t  FROM Foo t WHERE t.std >= :p_1 ");
q.setParameter("p_1", myDate, TemporalType.TIME);
private java.util.Date std;

@javax.persistence.Column(name = "STD", nullable = false, insertable = true, updatable = true)
@javax.persistence.Temporal(javax.persistence.TemporalType.TIMESTAMP)
public java.util.Date getStd()
{
    return std;
}

public void setStd(java.util.Date value)
{
    this.std = value;
}
Query q = em.createQuery( "SELECT t  FROM Foo t WHERE CAST(t.std as TIME) >= :p_1 ");
我的日期是:2013-12-11T12:01:01 (如果我使用toString:Wed Dec 11 12:01:01 UTC 2013)

在实体类中,std属性如下所示:

Query q = em.createQuery( "SELECT t  FROM Foo t WHERE t.std >= :p_1 ");
q.setParameter("p_1", myDate, TemporalType.TIME);
private java.util.Date std;

@javax.persistence.Column(name = "STD", nullable = false, insertable = true, updatable = true)
@javax.persistence.Temporal(javax.persistence.TemporalType.TIMESTAMP)
public java.util.Date getStd()
{
    return std;
}

public void setStd(java.util.Date value)
{
    this.std = value;
}
Query q = em.createQuery( "SELECT t  FROM Foo t WHERE CAST(t.std as TIME) >= :p_1 ");
我还尝试将entityClass中属性的注释更改为:

@javax.persistence.Temporal(javax.persistence.TemporalType.TIME)
public java.util.Date getStd()
{
    return std;
}
但这没用

在sql中,std属性是TIMESTAMP:

"STD" TIMESTAMP (6) NOT NULL ENABLE,
我必须在hibernate中使用JPA查询,本机查询不是一个选项。 有人能解释一下为什么它不起作用,我怎样才能正确地完成它

谢谢

编辑:

例如,如果数据库中的std值如下所示:

2013-12-08T10:00:00 
2013-12-08T14:00:00 
2013-12-11T10:00:00 
2013-12-11T14:00:00 
2013-12-14T10:00:00 
2013-12-14T14:00:00 
我在查询中输入了“2013-12-11T12:00:00”,我想返回所有实体,无论从日期算起,“std”的时间都较高。在本例中,这些:

2013-12-08T14:00:00
2013-12-11T14:00:00 
2013-12-14T14:00:00 
如果我检查hibernate调试日志,我可以看到std映射到org.hibernate.TimeType

[org.hibernate.hql.internal.ast.tree.DotNode](http-/127.0.0.1:8080-1) getDataType():std->org.hibernate.type。TimeType@f600d7a

[org.hibernate.hql.internal.ast.tree.FromReferenceNode] (http-/127.0.0.1:8080-1)已解决:t.std->foo0\uu0.std

[org.hibernate.hql.internal.ast.tree.FromReferenceNode] (http-/127.0.0.1:8080-1)已解析:t->foo0\uu0.ID

显然,您可以(至少)在Hibernate/HQL中使用SQL函数。这包括
CAST
,并要求DB做出适当的响应(即,
TIME
类型存在,并且可从
时间戳
进行强制转换)如果有效,它可能会像这样工作:

Query q = em.createQuery( "SELECT t  FROM Foo t WHERE t.std >= :p_1 ");
q.setParameter("p_1", myDate, TemporalType.TIME);
private java.util.Date std;

@javax.persistence.Column(name = "STD", nullable = false, insertable = true, updatable = true)
@javax.persistence.Temporal(javax.persistence.TemporalType.TIMESTAMP)
public java.util.Date getStd()
{
    return std;
}

public void setStd(java.util.Date value)
{
    this.std = value;
}
Query q = em.createQuery( "SELECT t  FROM Foo t WHERE CAST(t.std as TIME) >= :p_1 ");
(请注意,我没有备用db/Hibernate实例来测试这一点。可能也取决于Hibernate的版本。)

请注意,这将忽略任何索引!这更多的是因为您只查询了部分数据,而不是Hibernate部分的某些缺陷。解决方案是:

Query q = em.createQuery( 
    "SELECT t FROM Foo t WHERE ( EXTRACT(HOUR FROM t.std) * 60 + EXTRACT(MINUTE FROM t.std) ) >= :p_1" 
    );

Calendar cal = Calendar.getInstance();
cal.setTime(myDate);

int minutes = cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
q.setParameter("p_1", minutes);

... 您在该表中有超过一天的数据吗?你想在第二天(或任何其他时间)发生什么?编辑我的问题,并在其中举例说明。无论从日期部分如何,我都希望返回所有实体(即使日期部分在将来),哪个std的时间部分高于示例日期的时间部分。(我必须在数据库中存储完整的日期以供其他查询,但这里我只想按日期的时间部分进行筛选)我解决了它,并更新了答案别忘了接受您自己的答案!(如果可以)谢谢。我试过了,但在Hibernate4.2和oracle11g中不起作用。