Критерии гибернации один ко многим, множественные объекты - PullRequest
1 голос
/ 28 октября 2011
public class Company{

    private Long id;
    private String companyName;
    private List<Employee> employees;

}

public class Employee{

    private Long empid;
    private String fstName;
    private String lstName;
    private String sal;
    private Company company;

}

с использованием API-критериев Hibernate, я хочу построить следующий SQL

select compantName from company c,employee e where  c.id = e.companyid and
    (e.firstName like '%john%' and e.lastname like '%doe% ) or 
    (e.firstName like '%james%' and e.lastname like '%bond% ) or
    (e.firstName like '%mike%' and e.lastname like '%adams% )

Предположим, пользовательский интерфейс может искать имя или фамилию или Sal или название компании или любую из комбинаций

Также, что более важно, пользователь может одновременно искать нескольких сотрудников.

Я придумал следующий код.Пожалуйста, предложите, каков наилучший подход для выполнения вышеуказанного требования

 DetachedCriteria criteria = DetachedCriteria
                .forClass(Company.class);

    criteria.createAlias("employees","employees");            
    Disjunction or = Restrictions.disjunction();

      for(Employee emp : employees){
        or.add(Restrictions.and(Restrictions.ilike(
            "employees.fstName",emp.getFstName(), MatchMode.ANYWHERE),
        Restrictions.ilike(
            "employees.lstName",emp.getLstName(), MatchMode.ANYWHERE)));
        criteria.add(or);

       }

1 Ответ

0 голосов
/ 28 октября 2011
var criteria = DetachedCriteria.forClass(Company.class)
                   .CreateAlias("employees","emp",JoinType.LeftOuterJoin)

используя критерии, полученные выше, вы можете добавлять ограничения по своему усмотрению

используйте Restrictions.ilike("emp.<propertyName>"... для добавления ограничений на Employee
используйте Restrictions.ilike("this.<propertyName>"... для добавления ограничений на Company.

Вы можете использовать Restrictions.Or() между ограничениями для Company и Employee с Restrictions.And() между ограничениями для Employee.

JoinType помогает вам выбирать объекты Компании независимо от Employee s

Проверьте этот для лучшего понимания использования ICriteria в Hibernate.

Обратите особое внимание на использование CreateAlias и CreateCreteria, которые помогут вам эффективно добавить Restrictions.

Надеюсь, это послужит руководством для построения ваших критериев.

Редактировать

добавление этой части, чтобы объяснить, как добавить значение условия. Рассмотрим Search как контейнерный объект, получающий информацию из представления в слой доступа к данным.

public class Search{
   private String Value;
   //getter and setter...
}

В вашем слое доступа к данным вы можете получить критерии из верхнего фрагмента кода и использовать

      search.getValue()!=null && !"".equals(search.getValue()){
             criteria.Add(Restrictions....);
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...