我有一个可以正常工作的条件查询。
Criteria criteria = getSession().createCriteria(getPersistentClass());
criteria.add(Restrictions.eq("employerId",employerId))
.setFetchMode("card", FetchMode.JOIN)
.createCriteria("card")
.addOrder(Order.desc("cardId"))
.createCriteria("salary")
.add(Restrictions.eq("salaryType",SalaryIdentifierType.CONTRACTOR))
.add(Restrictions.eq("active","YES"));
现在,我需要向此条件添加另一个过滤器(条件)。新过滤器是joinDate
. 如果该joinDate
值已从前端传递,我必须将其添加到此查询中,否则joinDate
不应添加过滤器。
我已经设法使用析取来做到这一点(我知道,它很奇怪......但是AFAIK,只有析取才能在运行时添加过滤器,只有当它存在时)。我是这样做的,但我不想在这里使用析取,我正在寻找其他选择。
Criteria criteria = getSession().createCriteria(getPersistentClass());
-------------------------------------------------------------------------
Disjunction disjunctionDate = Restrictions.disjunction();
if(utilDate!=null){
disjunctionDate = (Disjunction) disjunctionDate.add(Restrictions.ge("startDate", utilDate));
}
-----------------------------------------------------------------------
criteria.add(Restrictions.eq("employerId",employerId))
.setFetchMode("card", FetchMode.JOIN)
.createCriteria("card")
.addOrder(Order.desc("cardId"))
.createCriteria("salary")
.add(Restrictions.eq("salaryType",SalaryIdentifierType.CONTRACTOR))
.add(Restrictions.eq("active","YES"))
.add(disjunctionDate);
我试过只使用 if 条件,像这样但不起作用(为了使这个编译,我不得不从上面修改查询格式,使每行都有标准,每行有分号)。
Criteria criteria = getSession().createCriteria(getPersistentClass());
criteria.add(Restrictions.eq("employerId",employerId));
criteria.setFetchMode("card", FetchMode.JOIN);
criteria.createCriteria("card");
criteria.addOrder(Order.desc("cardId"));
criteria.createCriteria("salary");
criteria.add(Restrictions.eq("salaryType",SalaryIdentifierType.CONTRACTOR));
criteria.add(Restrictions.eq("active","YES"));
if(startDate!=null){
criteria.add(Restrictions.ge("startDate",startDate));
}
关于如何使用比使用析取更好的选择来完成这项工作的任何想法?