JPA Hibernate PostgreSQL当前日期不';行不通

JPA Hibernate PostgreSQL当前日期不';行不通,hibernate,postgresql,playframework,jpa-2.0,Hibernate,Postgresql,Playframework,Jpa 2.0,我有一个定义了以下查询的PostgreSQL 9.3.6数据库: CREATE OR REPLACE VIEW calls_today AS SELECT cc.* FROM call_config cc WHERE cc.created_at >= current_date; 该视图用于通过JPA2使用Play Framework+Hibernate开发的web门户。除了与日期相关的查询外,其他一切似乎都很正常 如果服务器今天重新启动,视图看起来可以正常工作,但

我有一个定义了以下查询的PostgreSQL 9.3.6数据库:

CREATE OR REPLACE VIEW calls_today AS
SELECT
    cc.*
FROM
    call_config cc
WHERE
    cc.created_at >= current_date;
该视图用于通过JPA2使用Play Framework+Hibernate开发的web门户。除了与日期相关的查询外,其他一切似乎都很正常

如果服务器今天重新启动,视图看起来可以正常工作,但仅在今天。明天,我会在网页上看到过去两天的所有电话。第二天,又多了一天,所以三天等等。 如果我在psql客户机上发出查询,结果很好,就在当天

我一定是遗漏了什么,它看起来不像是缓存了查询结果(结果每天都在增长),而是在服务器重新启动时确定了当前的_日期。就像某种事先准备好的声明,我真的不知道

使用以下JPA 2 API从数据库中提取数据:

private static<T extends IOutgoingCallConfig> Result getCalls(Class<T> entityClass) {
Check.Argument.isNotNull(entityClass, "entityClass");

List<CallItem> calls = new ArrayList<>();

EntityManager em = JPA.em();

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<T> cq = cb.createQuery(entityClass);
Root<T> rootEntry = cq.from(entityClass);
CriteriaQuery<T> all = cq.select(rootEntry);
TypedQuery<T> allQuery = em.createQuery(all);

for(T entity: allQuery.getResultList()) {
   calls.add(new CallItem(entity));
}

    return jsonSuccess(calls);
}
没有这个问题。每次执行都会显示更新的当前服务器时间:

execute mystmt;
具有如下所示的简单视图:

CREATE OR REPLACE VIEW my_current_time as select current_time;
导致同样的问题。查询运行后,返回值始终相同:(

它可能与当前时间和当前日期的定义有关。 发件人:

由于这些函数返回当前事务的开始时间,因此它们的值在事务期间不会更改。这被认为是一个功能:其目的是允许单个事务具有一致的“当前”时间概念,以便同一事务中的多个修改具有相同的时间戳


结果证明这是事务范围问题。 我的控制器带有以下注释:

@Transactional(readOnly=true)

因为它只读取数据。出于某种原因,事务作用域跨越了所有未来的请求:(我在这里有点惊讶。我希望每个请求都有一个事务,或者根本没有(自动提交事务)

我变了

current_date

现在它甚至可以通过Hibernate正常运行


我想我必须阅读更多关于Hibernate和JPA 2的内容,否则如果我不清楚事务范围,我可能会遇到类似的问题。

首先,请回答问题-does query(今天的表调用)输出每天都在变化?如果是,这是hibernate/JPA问题,如果不是-postgres。刚刚在我的postgresql 9.4安装上测试了你的my_current_time视图。当从pgAdmin查询视图时,视图中的值会按预期更新。因此,在hibernate端似乎是个问题。可能是缓存,因此尝试切换。你可能可以因此,记录所有查询,然后您可以查看它是否实际查询视图。是的,视图运行良好。只返回今天的调用。由于某些原因,事务范围跨越未来的请求。
current_date
date_trunc('day', clock_timestamp())