休眠条件查询返回过时的结果

Posted

技术标签:

【中文标题】休眠条件查询返回过时的结果【英文标题】:Hibernate criteria query is returning me stale results 【发布时间】:2012-03-13 15:06:13 【问题描述】:

我在 Hsqldb 1.8.0 中有一个简单的表 ApplicationLog

一个单独的客户端将数据插入到这个表中。

我正在从另一个 java 客户端查询此表。 我发现如果此查询 java 客户端保持运行,则条件查询计数不正确。(即,如果插入是通过另一个客户端发生的,当我查询时我看不到这些结果 - 另一个客户端确实提交,我可以查看插入的来自 sql 客户端的语句 - 只有我的 hsql 客户端在查看新数据时出现问题)

如果我关闭客户端并重新启动它,则会返回数据。

这是我的查询代码:

SessionFactory sessionFactory = HibernateConfigurer.getFactory();

Session session = sessionFactory.openSession();
Criteria criteria = session.createCriteria(
ApplicationLog.class).setCacheMode(CacheMode.IGNORE);

if(keys != null) 

int size = keys.length;

Long[] allKeys = new Long[size];
for (int i = 0; i < size; ++i)

allKeys[i] = new Long(keys[i]);


criteria.add(
Restrictions.in(
"applicationLogItemKey", allKeys));


if((from != null) && (to != null)) 

criteria.add(Restrictions.ge(
"logTime", from));
criteria.add(Restrictions.le(
"logTime", to));
 else 

if(from != null) 
criteria.add(Restrictions.ge(
"logTime", from));
 else if(to != null) 
criteria.add(Restrictions.le(
"logTime", to));




criteria.setFirstResult(startNumber);
criteria.setMaxResults(pageSize);
criteria.addOrder(Order.desc("logTime"));

List applicationLogs = criteria.list();

session.close();
return applicationLogs;

我尝试了不同的缓存模式,以为我只是在访问缓存。 我还尝试驱逐有问题的班级。但没有任何帮助。除非我重新启动客户端,否则我只会看到陈旧的数据,而不会看到新插入的数据。

有人可以帮忙吗。

【问题讨论】:

你在 from 和 to 传递什么?在您运行客户端期间它们是否相同? 【参考方案1】:

使用session.flush()。刷新 Session 获取当前会话中的数据与数据库中的数据同步。

一个小问题:有太多未知数,即“to”、“from”和“startNumber”等。检查它们是否正确。

【讨论】:

我确实在插入新记录的地方使用了 session.flush。上面的代码只是读取-即使在读取时也需要 session.flush 吗? 不,你不需要那样做!对不起!

以上是关于休眠条件查询返回过时的结果的主要内容,如果未能解决你的问题,请参考以下文章

休眠条件查询到 JPA 条件查询

休眠条件排序依据

带有投影和限制的休眠条件查询问题

带有条件的休眠查询

使用 Group By 和 aliasToBean 的休眠条件查询

如何使用休眠条件运行函数?