【问题标题】:HQL returns duplicate entities on simple query when ordering by EnumType.ORDINAL当按 EnumType.ORDINAL 排序时,HQL 在简单查询中返回重复实体
【发布时间】:2023-03-16 17:26:01
【问题描述】:

我正在尝试在 Spring MVC 中使用 Hibernate HQL 获取实体列表。查询如下所示:

SELECT m FROM MyEntity m where property =:property ORDER BY otherProperty desc

问题是我得到了很多重复的结果(相同的 ID 和 Java 哈希),即使在 SELECT 之后添加了 DISTINCT 关键字也是如此。 这只发生在在枚举OtherProperty 存储为ORDINAL (int) 在MySQL 中排序的情况下。我尝试过使用Criteria和其他方法,总是发现这种问题。

这个问题有简单的解决方案吗?将枚举移动到 EnumType.STRING 是我要考虑的最后一个选项,因为它涉及重构数据库,但如果这是您能想到的唯一选项,我想听听关于此的建议。

MyEntity 实体如下所示:

@Entity
@Table(name="my_entity")
public class MyEntity extends BaseEntity<Long> {

    private static final long serialVersionUID = 4L;

    @Searchable
    @ManyToOne
    @JoinColumn(name = "property_id")
    private Property property;

    @Searchable
    @Column(name = "other_property")
    @Enumerated(EnumType.ORDINAL)
    private OtherProperty otherProperty;

    (...)
}

BaseEntity 类如下所示:

@MappedSuperclass
@SuppressWarnings("serial")
public abstract class BaseEntity<T> implements Serializable {

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

    @Version
    private Long version;

    public Long getVersion() {
        return version;
    }

    public void setVersion(Long version) {
        this.version = version;
    }

    public T getId() {
        return id;
    }

    public void setId(T id) {
        this.id = id;
    }
}

最后,OtherProperty 枚举如下所示:

public enum OtherProperty { 
    VAL_A ("Hi"), 
    VAL_B ("Howdy"),
    VAL_C ("Aye");

    private String name;
    private OtherProperty(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}

【问题讨论】:

  • 试试这个:query.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
  • 抱歉,刚试了。就像添加distinct sql 子句一样,它仍然返回相同的重复项。我认为这是一个错误,因为 SQL 语句非常简单,没有连接,它应该只返回每一行一次。

标签: mysql hibernate enums hql


【解决方案1】:

好的,这可能是我遇到过的最愚蠢的问题(我的错)。我已经覆盖的MyEntity 类中的equals(Object o) 方法无法正常工作,因此Java 实际上无法区分一个实体和另一个实体。修复了那部分,修复了整个问题。

所以,以防万一这对其他人有帮助,如果您在 HQL 中遇到重复项,请检查您的 equals(Object o) 方法。

【讨论】:

    猜你喜欢
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    相关资源
    最近更新 更多