【问题标题】:How use hibernate criteria for a left outer join without direct link into the two tables如何在没有直接链接到两个表的情况下使用休眠条件进行左外连接
【发布时间】:2009-10-01 15:20:59
【问题描述】:

我正在尝试将 SQL 请求转换为 Hibernate 标准。

我的任务是在 SQL 中工作:

    select * from objective 
    left outer join conditionstate 
      on objective.conditionid = conditionstate.conditionid 
         and conditionstate.personid = XXXX 
    where objective.toto_id = YYYYY 

objective不是直接映射到condition_state,而是映射到condition。

objective --> condition <-- condition_state

我已经测试过类似的东西:

    final DetachedCriteria criteriaObjective = 
       DetachedCriteria.forClass(Objective.class);
    criteriaObjective.createAlias("conditionState", "conditionState", Criteria.LEFT_JOIN);

没有成功..

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    如果没有看到您的实际映射,很难提出建议。按照您的解释并假设条件和条件状态都映射为多对一,您将编写如下内容:

    final DetachedCriteria criteriaObjective = 
      DetachedCriteria.forClass(Objective.class);
    criteriaObjective
      .createCriteria("condition", Criteria.LEFT_JOIN)
      .createCriteria("conditionState", Criteria.LEFT_JOIN)
      .add(Restrictions.eq("personid", "XXXX") );
    criteriaObjective.add(Restrictions.eqProperty("toto_id", "YYYY") );
    

    请注意,以上内容等同于您提供的 SQL 查询,因为“personid”条件将作为“WHERE”子句的一部分生成。据我所知,使用 Criteria API 进行带条件的左连接是不可能的 - 您可能需要使用 HQL 来代替它提供 with keyword 用于该确切目的:

    select o from objective as o
      left join o.condition as c
      left join c.conditionState as cs
      with cs.person_id = 'XXXX'
      and o.toto_id = 'YYYY'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      相关资源
      最近更新 更多