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 に答える