Hibernate Criteria Query ...添加新条件

时间:2012-10-09 16:27:27

标签: java hibernate java-ee criteria

我有一个适用的标准查询。

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

关于如何使用比使用析取更好的选项的任何想法?

1 个答案:

答案 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