Hibernate如何将Criteria转换为HQL?

时间:2011-10-07 10:37:31

标签: hibernate hql hibernate-criteria

我对Criteria查询有疑问。

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

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

所以 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();

谢谢!

2 个答案:

答案 0 :(得分:0)

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

select o from ObjectDao o where o.objectType.client.name = :clientName

答案 1 :(得分:0)

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

delete from Client where ...

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

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

使用Session.delete删除对象,并确保将对象图保留在内存中。

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