You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hibernate 6查询生成错误:鉴别器条件位置异常问题

Hibernate 6 单表继承关联查询鉴别器条件位置错误问题

实体类定义

@Entity
@Table(name = "users")
public class User extends BaseEntity implements Serializable {

..

    @OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.MERGE, CascadeType.PERSIST }, mappedBy = "entity")
    private Set<UserUdfValue> properties = new HashSet<>();

..

}

@Entity
@DiscriminatorValue(UserUdfValue.UDFID)
public class UserUdfValue extends ValueBase {

    private static final long serialVersionUID = -898152830344556386L;

    public final static String UDFID = "1";

    @ManyToOne(fetch=FetchType.LAZY, cascade = {})
    @JoinColumn(name = "entity_id", nullable = false)
    private User entity;

    public User getEntity() {
        return entity;
    }

    public void setEntity(User entity) {
        this.entity = entity;
    }

}


@Entity(name = "udf_value")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "target_type", discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorOptions(force = false)
public abstract class ValueBase implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
...

}

问题现象

Hibernate 5.6 生成的预期SQL

根据ID查询User时,鉴别器条件被放在JOIN子句中,查询逻辑符合预期:

SELECT *
FROM users user0_
LEFT OUTER JOIN udf_value properties14_ ON user0_.id = properties14_.entity_id
    AND properties14_.target_type = 1
WHERE user0_.id = ?

Hibernate 6 生成的错误SQL

升级到Hibernate 6后,鉴别器条件被移至WHERE子句,导致查询结果不符合预期:

SELECT *
FROM users u1_0
LEFT JOIN udf_value p2_0 ON u1_0.id = p2_0.entity_id
WHERE p2_0.target_type = 1
    AND u1_0.id = ?

该SQL会过滤掉没有对应UserUdfValue记录的User,完全违背了LEFT JOIN的设计意图。

问题确认

该问题已被Hibernate官方确认为Bug。


内容的提问来源于stack exchange,提问作者gaetann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:45:39