gpt4 book ai didi

java - 过滤 TIMESTAMP 的 TIME 部分不起作用(JPA2、HIBERNATE)

转载 作者:太空宇宙 更新时间:2023-11-04 07:10:42 27 4
gpt4 key购买 nike

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

例如,我想搜索标准时间大于 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);

我的日期是:2013-12-11T12:01:01(如果我使用 toString:Wed Dec 11 12:01:01 UTC 2013 )

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

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;
}

我还尝试将entityClass中属性的注释更改为:

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

但这并没有帮助。

在sql中,std属性是TIMESTAMP:

"STD" TIMESTAMP (6) NOT NULL ENABLE,

我必须将 JPA 查询与 hibernate 一起使用, native 查询不是一个选项。有人可以解释为什么它不起作用以及我该如何正确地做到这一点吗?

谢谢!

编辑:

例如,如果数据库中的标准值如下:

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) Resolved : t.std -> foo0_.STD

[org.hibernate.hql.internal.ast.tree.FromReferenceNode] (http-/127.0.0.1:8080-1) Resolved : t -> foo0_.ID

最佳答案

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

Query q = em.createQuery( "SELECT t  FROM Foo t WHERE CAST(t.std as TIME) >= :p_1 ");

(请注意,我没有支持数据库/Hibernate 实例来测试它。也可能取决于 Hibernate 的版本。)

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

关于java - 过滤 TIMESTAMP 的 TIME 部分不起作用(JPA2、HIBERNATE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20676308/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com