【发布时间】: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 可以帮助你吗?