java - Hibernate Criteria Query ...添加新条件

标签 java hibernate jakarta-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

我已经设法使用析取来做到这一点(我知道,这很奇怪......但是据我所知,只有析取才能在运行时添加过滤器,只有它存在时)。我是这样做的,但我不想在这里使用析取,我正在寻找其他选择。

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

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

最佳答案

所以你是说这对你不起作用?

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

关于java - Hibernate Criteria Query ...添加新条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12804401/

相关文章:

java - 如何使用 java-selenium 中的 cucumber bdd 框架处理 Bootstrap 下拉列表

java - 模拟测试 SOAP 接口(interface)

java - 二叉树的后序遍历

java - hibernate -OGM [PersistenceUnit : person] Unable to build Hibernate SessionFactory

java - 安装 JDK 1.7 和 Java EE 7 SDK 后出现混淆?

java - 在 Websphere Liberty Profile 中的 J2EE 应用程序中使用托管 Bean 和注入(inject)

java - 二维数组作为方法的参数?

mysql - 第一个带有注释的 Hibernate 类

java - Hibernate 映射返回 null 属性

java - Struts2,JSP,迭代中的 null 和 Empty 测试字符串