我对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();
谢谢!
答案 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删除对象,并确保将对象图保留在内存中。
或者在删除查询后刷新并清除会话。