所以我仍然试图让自己熟悉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()会返回什么?
答案 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。