因此,我仍在努力使自己熟悉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
的简写。