2011-10-07 112 views
1

我遇到了标准查询问题。Hibernate如何将Criteria转换为HQL?

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

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

所以 1.如何在roder中同步这个标准查询以获得REAL对象? 2.如果1是不可能的,我想变换条件查询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(); 

谢谢!

+0

您是否使用某种Hibernate二级缓存? – ssedano

回答

0

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

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

是的查询工作,但对象仍然在会话埃文如果我使用HQL :( – superscral

0

如果我理解正确的话,你执行一个查询如

delete from Client where ... 

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

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

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

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

+0

'session.clear(); session.flush();'已经完成HQL删除后,但对象仍然在这里 我已经完成一个HQL删除,以提高perfs哪里不是很好用Criteria删除 – superscral

+0

这里的过程: 1.首先,用户可以显示删除的对象 所以我这样做与Criteria和现在用HQL查询 2.用户看到对象,如果他同意,他可以删除对象,当他按下“删除按钮 如果他不同意,如果可以在窗体中输入新参数,并单击”显示“按钮来查看对象他可能想要删除 我有更改删除标准为了提高宠物HQL,HQL删除更好,以便删除很多很多的对象 但现在的显示步骤并不好:( 如果后HQL得到我添加清除/关闭: 问题! :(谢谢 – superscral