因此,我仍在努力使自己熟悉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是否多余?

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

最佳答案

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) 将在条件中已经存在的数据与通过属性association建模的关联中设计的表之间形成内部联接。它还将在关联实体处“根”(如Javadocs中所声明的)条件,以便在进一步调用createCriteria(association)时,association引用在最后一个“根”实体上声明的关联属性。

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

09-12 11:17