因此,我仍在努力使自己熟悉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)
将导致已经存在于条件中的数据与以属性关联为模型的关联中设计的表之间的内部联接.它还将在关联实体处“根”(如Javadocs中所声明的)条件,以便在进一步调用createCriteria(association)时,关联指的是在最后一个“根”实体上声明的关联属性.
这是带有joinType CriteriaSpecification.INNER_JOIN的Criteria.createCriteria(association,joinType)的简写.