从 hibernate 5.5.x 更新到 Hibernate 6.1.7 生成了不正确的鉴别器查询

问题描述 投票:0回答:1

我的模型如下:

@Entity
@Table(name = "PARTY")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "CLASS", discriminatorType = DiscriminatorType.STRING)
public class Party implements Serializable {

    @Id
    @GeneratedValue
    @Column(name = "PARTY_ID")
    private long partyID;

    @Column(name = "STATE")
    private String state;

    /*Lots of other columns NOT including CLASS though */
}

@Entity
@DiscriminatorValue("Organisation")
public class Organisation extends Party {
 
 @Column(name = "ORGANISATION_NAME", unique = true)
 private String name; 
}

@Entity
@DiscriminatorValue("Person")
public class Person extends Party {
  
  @OneToMany(cascade=CascadeType.ALL, mappedBy = "clientParty", fetch = FetchType.LAZY, orphanRemoval = true)
    @Fetch(value = FetchMode.SUBSELECT)
    private List<Relationship> relationships = new ArrayList<>();

}

@Entity
@Table(name = "RELATIONSHIP")
public class Relationship implements Serializable { 

    @Id
    @GeneratedValue
    @Column(name = "RELATIONSHIP_ID")
    private long relationshipId;

    @Column(name="CLIENT_PARTY_ID", insertable = false, updatable = false)
    private Long clientPartyId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "CLIENT_PARTY_ID", nullable = false)
    private Person clientParty;

    @Column(name="SUPPLIER_PARTY_ID", insertable = false, updatable = false)
    private Long supplierPartyId;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "SUPPLIER_PARTY_ID", nullable = false)
    private Organisation supplierParty;
}

我有一个查询,用于获取状态 = 'active' 或组织名称 = 'abc' 的不同用户,HQL 如下所示:

SELECT DISTINCT u FROM Person u 
LEFT JOIN Relationship r ON u.partyID = r.clientPartyId 
LEFT JOIN Organisation o ON r.supplierPartyId = o.partyID 
WHERE lower(o.name) LIKE :orgName OR
lower(u.state) = :state

我有一个测试用例,预计 3 个用户会回来:

  1. 用户 A - 状态“活动”,分配给名为“abc”的组织
  2. 用户 B - 状态“非活动”,分配给名为“abc”的组织
  3. 用户 C - 状态“活动”,未分配给任何组织

在 Hibernate 5 中,这有效。当我升级到 hibernate 6 时,它删除了用户 C,因为它没有定义关系。

这是在hibernate 6.1.7中生成的SQL

select distinct
m1_0.PARTY_ID from PARTY m1_0 
left join RELATIONSHIP r1_0 on m1_0.PARTY_ID=r1_0.CLIENT_PARTY_ID 
left join PARTY m2_0 on r1_0.SUPPLIER_PARTY_ID=m2_0.PARTY_ID 
where (lower(m2_0.ORGANISATION_NAME) like ? or lower(m1_0.STATE)=?) and
m1_0.CLASS='Person' and m2_0.CLASS='Organisation'

CLASS 子句不应该是 LEFT JOIN 的一部分而不是 WHERE 子句吗?

我发现了类似的错误报告https://discourse.hibernate.org/t/hibernate-6-wrong-query- generated-with-discriminatorvalue/6984https://hibernate.atlassian.net/browse/HHH-15829 但是我升级到6.1.7(我无法升级到6.2,因为还有其他一些问题)并且它还没有解决这个问题。

如果有人有任何想法,我们将不胜感激。谢谢

java hibernate hql
1个回答
0
投票

这听起来与另一个 Hibernate bug 非常相似:https://hibernate.atlassian.net/browse/HHH-16438。我们在最近的更新中改进了继承的工作方式,我建议尽快升级到最新稳定版本以利用这一点。

您提到升级到 6.2 会导致另一个问题,请在 Hibernate 的 问题跟踪器中报告。

© www.soinside.com 2019 - 2024. All rights reserved.