2015-04-24 93 views
0

我有一个PostgreSQL 9.3.6数据库定义以下查询:JPA休眠PostgreSQL的CURRENT_DATE不起作用

CREATE OR REPLACE VIEW calls_today AS 
SELECT 
    cc.* 
FROM 
    call_config cc 
WHERE 
    cc.created_at >= current_date; 

的视图用于与游戏框架+开发的门户网站通过JPA 2 Hibernate的。除了日期相关的查询之外,一切似乎都正常。

如果服务器今天重新启动,该视图看起来像工作,但只有今天。明天,我会在网页上看到过去两天的所有电话。第二天,另外一天,三天等等。 如果我在psql客户端上发出查询,结果都很好,只是当天。

我必须缺少一些东西,它看起来不像查询结果被缓存(每天结果增长),而是current_date在服务器重新启动的那一天被修复。就像某种准备好的陈述一样,我真的不知道。

的数据从数据库具有以下JPA的2 API拉:

prepare mystmt as select current_time; 

不会受到这个问题:

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

我已经通过PSQL下列准备好的查询测试。每个执行揭示了更新当前服务器时间:

execute mystmt; 

有一个简单的观点象下面这样:

CREATE OR REPLACE VIEW my_current_time as select current_time; 

导致同样的问题。一个查询已运行,​​返回值始终是相同的:(

这可能涉及到CURRENT_TIME CURRENT_DATE和 的定义从PostgreSQL 9.4 documentation

由于这些函数返回的开始时间在交易过程中,它们的值不会改变,这被认为是一个特征:意图是允许单个交易具有“当前”时间的一致概念,以便在同一交易中的多个修改承担相同的时间戳

+0

首先,请回答问题 - 查询(TABLE calls_today)是否每天输出变化?如果是的话,这是休眠/ JPA问题,如果不是 - postgres。 – Eugene

+0

刚刚在我的postgresql 9.4安装中测试了my_current_time视图。当从pgAdmin查询视图时,视图中的值按预期进行更新。所以它似乎是休眠方面的一个问题。可能缓存,所以尝试切换。您可能还可以记录所有查询,然后您可以看到它是否实际查询视图。 – Eelke

+0

是的,视图运行良好。只有今天的电话才会被退回。 – aguyngueran

回答

0

原来是交易范围问题。 我的控制器都被注解:

@Transactional(readOnly=true) 

因为它仅读取数据。由于某些原因,交易范围跨越了所有未来的要求:(我对此有点惊讶,我期望每个请求都有一个交易或者根本没有交易(自动交易交易)

我已经改变

current_date 

date_trunc('day', clock_timestamp()) 

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

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