【问题标题】:Hibernate: Left Join with Join Table and Join RestrictionHibernate:左连接与连接表和连接限制
【发布时间】:2013-12-17 18:23:37
【问题描述】:

我想要这个 SQL:

select * from tableA
left outer join joinAB on tableA.id = joinAB.a_id
left outer join tableB on tableB.id = joinAB.b_id and tableB.otherCol = 4;

使用这样的模型:

class TableA {
    @OneToMany
    @JoinTable(
            name = "joinAB",
            joinColumns = @JoinColumn(name = "a_id"),
            inverseJoinColumns = @JoinColumn(name = "b_id")
    )
    private Set<TableB> bs;
}

我正在尝试编写一个标准,它将返回所有带有 bs 的 TableAs,但也包括不带任何 bs 的 as。因此左外连接。 tableB 很大,所以 otherCol 实际上是一个索引列,我需要限制它以防止 MySQL 进行全表扫描。

我正在使用这个标准:

this.getSession().createCriteria(TableA.class)
    .createAlias("bs", "bs", CriteriaSpecification.LEFT_JOIN,                       
    Restrictions.eq("bs.otherCol", 4));

但我最终得到了这个 SQL:

select * from tableA this_ left outer join joinAB bs5_ 
on this_.id=bs5_.a_id and ( bs1_.otherCol=4 ) 
left outer join tableB bs1_ on bs5_.b_id=bs1_.id and ( bs1_.otherCol=4 )

所以你看到它在连接表上添加了一个无意义的限制(结果 SQL 甚至不会执行。)

我如何让它做正确的事?

【问题讨论】:

  • 经过几次尝试,我怀疑普通休眠是否可行,因为即使存在 关联,您也试图强制它声明 bs 为空,从而在数据库和 ORM 表示。不过,喜欢被证明是错误的。
  • 我从未尝试过,但手册中的@Filter 可以帮助你吗?

标签: hibernate join


【解决方案1】:

Criteria crit = session.createCriteria(TableA.class);

crit.createCriteria("joinAB", "AB", JoinType.LEFT_OUTER_JOIN);

crit.createCriteria("tableB", "TB", JoinType.LEFT_OUTER_JOIN, Restrictions.eq("TB.otherCol", "4"));

crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 2012-08-03
    • 2021-09-02
    • 2010-10-06
    • 1970-01-01
    相关资源
    最近更新 更多