关于Hibernate API中Criteria.createCriteria的问题

时间:2011-09-21 09:20:32

标签: java sql hibernate criteria

所以我仍然试图让自己熟悉Hibernate Criteria API,并且我有这段Java代码,我想寻求澄清。

Criteria c = super.getSession().createCriteria(PpNnCtDetail.class);
c.add(Restrictions.between("commencementDate", fromDate, toDate);

这部分我理解发生了什么 - 用SQL来表达它会是这样的 - 如果我错了就纠正我,

SELECT * FROM PpNnCtDetail WHERE commencementDate >= fromDate AND commencementDate <= toDate;

问题在于上面两行后面的代码。

c = c.createCriteria("nnContractTbl");
c.createCriteria("progCategory").add(Restrictions.in("progCategoryId", allProgCat));
c.createCriteria("acadOrgTbl");
c.createCriteria("serviceType");
c.createCriteria("campusTbl");
return c.list();

试图完成的第一线是什么?这项任务是否冗余?

实际上,c.createCriteria尝试实现的是什么?等效的SQL查询是什么样的?更重要的是,c.list()会返回什么?

2 个答案:

答案 0 :(得分:2)

c = c.createCriteria("nnContractTbl");上的赋值是多余的,createCriteria和几乎所有Criteria方法都会修改它们被调用的实例,并返回实例本身以进行方法通道。所以你可以像这样链接:

return super.getSession().createCriteria(PpNnCtDetail.class)
    .add(Restrictions.between("commencementDate", fromDate, toDate)
    .createCriteria("nnContractTbl")
    .createCriteria("progCategory").add(Restrictions.in("progCategoryId", allProgCat))
    .createCriteria("acadOrgTbl")
    .createCriteria("serviceType")
    .createCriteria("campusTbl")
    .list();

关于该序列的结果,Criteria.createCriteria(association)将在条件中已有的数据和由属性{{1建模的关联中设计的表中设置的表之间产生内连接 }}。它还将“根”(在Javadocs中声明)关联实体的Criteria,以便在进一步调用association时,createCriteria(association)引用在最后一个“root”上声明的关联属性实体。

这是association Criteria.createCriteria(association, joinType) joinType的简写。

答案 1 :(得分:1)

上面指定的那些createCriteria基本上等同于传递给实体的INNER JOIN。

找到问题答案(同时也学习休眠)的最佳方法是在hibernate配置文件中turn SQL logging on,并检查生成的SQL。