【问题标题】:OR clause in LEFT_JOIN in hibernate criteria休眠条件中 LEFT_JOIN 中的 OR 子句
【发布时间】:2013-09-25 21:27:19
【问题描述】:

如何在休眠条件的 LEFT_JOIN 中提供 OR 子句。

Criteria mainCrit=hibernateSession.createCriteria("Main.class");    
Criteria aPropertyCrit=mainCrit.createCrieria("child",CriteriaSpecification.LEFT_JOIN);

它生成sql为

select this_.Id,this_childId....
from main as this_
left join child as child1_ on child1_ .id=this_.childId
where.....

而且我需要生成 sql 为

select this_.Id,this_childId....
from main as this_
left join child as child1_ on child1_.id=this_.childId or child_.ParentId=this_.childId
where.....

如何在上述条件中的 LEFT_JOIN 中提供 OR 子句。

【问题讨论】:

  • 你可以使用hibernate conjuction/disjunction来做到这一点。
  • 你有没有解决过这个问题?如果是,请分享可能的解决方案

标签: java mysql sql hibernate


【解决方案1】:

即使使用 Criteria API,也可以扩展 JOIN ... ON 部分。但只是为了更具限制性,即添加 AND 部分。

看看createCriteria方法的重载,主要是最后一个参数withClause

Criteria createCriteria(String associationPath,
                        String alias,
                        JoinType joinType,
                        Criterion withClause)
                        throws HibernateException

创建一个新的 Criteria,“植根于”关联实体,分配给定的别名并使用指定的连接类型。

参数:

  • associationPath - 点分隔的属性路径
  • alias - 分配给加入关联的别名(供以后参考)。
  • joinType - 要使用的连接类型。
  • withClause - 要添加到连接条件(ON 子句)的条件

事实上,任何其他方法(例如添加 OR) 都破坏了映射原则,引入了在末尾进行交叉连接的能力。见Hibernate criteria: Joining table without a mapped association

【讨论】:

  • 条件 mainCrit=hibernateSession.createCriteria("Main.class","main");条件 aPropertyCrit=mainCrit.createCrieria("child","child",JoinType.LEFT_OUTER_JOIN,Restrictions.eqProperty("main.childid","child.parentid"));现在它在 this_.childid=child_.Id 和 (this_.SectionId=child_.parentId) 上插入左外连接子 child_。我想要 OR 子句而不是生成的 sql 中的 AND。
  • 在第一段中,我解释了唯一的方法,即如何使用 JOIN ... ON 是使用 AND。不支持 OR,因为这会破坏映射和关系。这是正确的 ORM 行为
  • 那么现在我该如何实现我想要的结果。我想我现在会尝试用 DetachedCriteria 来做。非常感谢您提供的任何意见。
  • 我建议使用Subquery 过滤,即创建一个 SQL 脚本,返回我们要用于过滤的 ID,然后将其包装在 DetachedCriteria 中。添加标准作为限制。请尝试检查这里的基本概念stackoverflow.com/a/12637204/1679310。我们可以使用 OR 表达式包装两个子查询(child id 和 child.parentId)...
猜你喜欢
  • 2012-02-12
  • 2012-09-06
  • 1970-01-01
  • 2021-12-21
  • 2014-06-24
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多