1

我有一个可以正常工作的条件查询。

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));
     }

关于如何使用比使用析取更好的选择来完成这项工作的任何想法?

4

1 回答 1

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

于 2012-10-09T16:51:29.153 回答