1

我对条件查询有疑问。

在另一种方法中,我使用 HQL 查询来删除数据库中的一些对象。查询有效。

实际上,在另一种方法中,我执行获取对象的条件查询。当我获取对象时,它们不会同步到数据库。

那么 1. 如何在 roder 中同步此条件查询以获取 REAL 对象?2. 如果 1. 不可能,我想将 Criteria 查询转换为 HQL

这是我的标准查询:

    final Criteria crit = session.createCriteria(ObjectDao.class);
    if (clientName != null && clientName.length() > 0) {
        crit.createAlias("objectType.client", "client");
        crit.add(Restrictions.eq("client.name", clientName));
    }
    if (objectType != null && objectType.length() > 0) {
        crit.createAlias("objectType", "objectType");
        crit.add(Restrictions.eq("objectType.type", objectType));
    }
    final List<ObjectDao> ret = crit.list();

和 HQl 转换的查询不起作用

    String hqlQuery = "select ObjectDao where objectType.client.name = :clientName";
    Query query = session.createQuery(hqlQuery)
    // .setParameter("objectList", objectType)
            .setParameter("clientName", clientName);
    final List<ObjectDao> ret2 = query.list();

谢谢!

4

2 回答 2

0

如果我理解正确,您正在执行一个查询,例如

delete from Client where ...

然后执行一个 Criteria 查询,它返回 ObjectDaos 仍然有一个您刚刚删除的客户端。

如果这是正确的,那么这是预期的行为。DML 样式查询(即更新和删除查询)绕过会话。这意味着如果您删除的某些对象在删除查询之前已经加载到会话中,Hibernate 不会从会话中删除它们,并且会话不会反映数据库的实际状态。

使用 Session.delete 删除您的对象,并确保在内存中维护您的对象图。

或者在删除查询之后刷新并清除会话。

于 2011-10-07T10:50:53.653 回答
0

看起来您正在使用 2 级缓存。如果是这样,这也行不通。

select o from ObjectDao o where o.objectType.client.name = :clientName
于 2011-10-07T10:46:34.780 回答