criteria.add和criteria.equals之间的区别

时间:2013-06-07 08:22:21

标签: hibernate

hiberante条件中 criteria.add criteria.equals 有什么区别?

只是示例:

返回25条记录

criteria.equals(Restrictions.eq("templateType", TemplateType.DEFAULT_TEMPLATE));

返回2条记录:

criteria.add(Restrictions.eq("templateType", TemplateType.DEFAULT_TEMPLATE)); 

当我hibernate.show_sql时,输出

  • 表示criteria.equals,未生成语法
  • 代表criteria.add,this_.template_type =?

注意:使用Hibernate 3.

修改

try{
List<Form> forms=Collections.emptyList();
Criteria normCriteria=session.createCriteria(NormMaster.class);
normCriteria.add(Restrictions.eq("id",normId));
normCriteria.setProjection(Projections.property("libraryId"));
List<Long> libNormIds=normCriteria.list();

if(libNormIds!=null && libNormIds.size()>0)
{
    Criteria criteria=session.createCriteria(Form.class);
    criteria.add(Restrictions.in("normId", libNormIds));
    criteria.equals(Restrictions.eq("templateType", TemplateType.DEFAULT_TEMPLATE));
    //criteria.add(Restrictions.eq("templateType", TemplateType.DEFAULT_TEMPLATE));
    criteria.setFetchMode("formControlMaps", FetchMode.JOIN);
    criteria.setFetchMode("formControlMaps.data", FetchMode.JOIN);
    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    forms=criteria.list();
}
return forms;
}
 catch (Exception e) {
     e.printStackTrace();
}

3 个答案:

答案 0 :(得分:1)

无法将criteria.addcriteria.equals进行比较。

criteria.addCriterion添加到您的Criteria,与您的情况类似:

 criteria.add(Restrictions.eq("templateType", TemplateType.DEFAULT_TEMPLATE)); 

此处Restrictions.eq("templateType", TemplateType.DEFAULT_TEMPLATE)会返回Criterion对象,该对象会添加到Criteria对象中。

criteria.equals是来自Object类的继承方法,用于检查java对象的相等性!所以你的代码如下,

 criteria.equals(Restrictions.eq("templateType", TemplateType.DEFAULT_TEMPLATE));

对您的Criteria对象不执行任何操作,但仅返回false。您可以通过简单地注释criteria.equals代码部分来确定我的陈述。

您会看到此行在生成查询时无效!

答案 1 :(得分:0)

criteria.equals:实际上是对象equals方法,它检查传递的对象是否等于LHS

criteria.add:将传递的参数添加到标准where子句

答案 2 :(得分:0)

为Sazzadur的回答添加更多内容。 Criteria接口由CriteriaImpl和其他扩展Object类的类实现。所以criteria.equals调用Object类的equals方法。广告这不是查询生成的一部分,因此您不会在hibernate为您的条件生成的查询中看到任何内容。

希望这有帮助。