可空多对一的休眠默认连接

Posted

技术标签:

【中文标题】可空多对一的休眠默认连接【英文标题】:Hibernate default joining for nullable many-to-one 【发布时间】:2010-12-04 06:00:08 【问题描述】:

我在 ProductDfn 类中有这样的休眠映射

@ManyToOne( fetch = FetchType.LAZY, optional = true )
@JoinColumn( name = "productTypeFk", nullable = true )
public ProductType getProductType()

    return productType;

请注意,该关系被定义为可选(并且该列可以为空)。

当做这样的 HQL 时

select p.name as col1, p.productType.name as col2 from ProductDfn p

内部连接用于将 ProductDfn 连接到 ProductType,因为 hibernate 从 select 子句中的隐式连接生成显式 SQL 连接。

但是,当 productType 为 null(在数据库中)执行上述操作时,由于内部连接,没有返回任何行。对于这种关系,我希望休眠默认进行外部连接(因为关系是可选的),所以我会为 col2 返回一个“null”,而不是根本没有行。

有人知道这是否可行吗?

谢谢。

【问题讨论】:

【参考方案1】:

使用内连接是因为您在 select 子句中明确列出了 p.productType.name。如果您只是选择 ProductDfn,就不会发生这种情况,因为您的 fetch 设置为 LAZY

如果您只需要检索这两个属性,则必须在查询中明确指定外连接:

select p.name as col1, ptype.name as col2
  from ProductDfn p
  left join fetch p.productType ptype

【讨论】:

谢谢,我正在寻找一种方法来让休眠更改它的默认连接类型,用于在 select 子句中完成的隐式连接。原因是我们有一个应用程序,其中许多查询是由于检索表格数据而自动/半生成的。所以我们可以做 base object = ProductDfn and col1 is name, col2 is productType.name 等等。通常这工作正常,只是对于可为空的外键它不能像我想要的那样工作。 虽然没有“默认连接类型” - 隐式连接总是是内部连接。如果您的查询正在生成,请考虑使用 Criteria 而不是 HQL - 它基本上强制使用显式描述关联(通过别名/嵌套条件),您始终可以将其指定为外连接。

以上是关于可空多对一的休眠默认连接的主要内容,如果未能解决你的问题,请参考以下文章

如何将这种多对一的关系改为一对一?

休眠延迟加载不适用于多对一映射

多对一的 JPA 标准 API 规范

hibernate关于多对多映射和多对一的hql查询

一对多和多对一的关系,用mybatis写

JPA:映射关联关系------映射单向多对一的关联关系