我有一个适用的标准查询。
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));
}
关于如何使用比使用析取更好的选项的任何想法?
答案 0 :(得分:4)
所以你说这不适合你?
Criteria criteria = getSession().createCriteria(getPersistentClass())
.add(Restrictions.eq("employerId",employerId))
.setFetchMode("card", FetchMode.JOIN)
.createCriteria("card")
.addOrder(Order.desc("cardId"))
.createCriteria("salary", "sl") // <- alias for salary
.add(Restrictions.eq("sl.salaryType",SalaryIdentifierType.CONTRACTOR))
.add(Restrictions.eq("sl.active","YES"));
if(startDate!=null) {
criteria.add(Restrictions.ge("sl.startDate",startDate));
}
请参阅http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#querycriteria-associations