Hibernate Criteria一对多关联,多个对象

时间:2011-10-28 16:20:56

标签: hibernate

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;

}

使用Hibernate标准api,我想构建以下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% )

假设UI用户可以搜索名字或姓氏或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 :(得分:0)

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

查看this以更好地了解在Hibernate中使用ICriteria

特别注意使用CreateAliasCreateCreteria,以帮助您有效地添加Restrictions

希望这可以作为制定标准的指南。

修改

添加此部分以解释如何添加条件值。 将Search视为容器对象,将信息从View访问到数据访问层。

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

在您的数据访问层中,您可以从顶部代码段获取条件并使用

      search.getValue()!=null && !"".equals(search.getValue()){
             criteria.Add(Restrictions....);
      }