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
相关产品推荐
相关产品推荐

