gpt4 book ai didi

mysql - 当按 EnumType.ORDINAL 排序时,HQL 在简单查询中返回重复实体

转载 作者:行者123 更新时间:2023-11-28 23:24:38 25 4
gpt4 key购买 nike

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

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

问题是我得到了很多重复的结果(相同的 ID 和 Java 散列),即使在 SELECT 之后添加了 DISTINCT 关键字也是如此。 这只会发生,其中按枚举 OtherProperty 排序,在 MySQL 中存储为 ORDINAL (int)。我试过使用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;
}
}

最佳答案

好吧,这可能是我遇到过的最愚蠢的问题(我的错)。我在 MyEntity 类中重写的 equals(Object o) 方法无法正常工作,因此 Java 实际上无法区分一个实体与另一个实体。解决了那个部分,解决了整个问题。

因此,以防万一这对其他人有帮助,请检查您的 equals(Object o) 方法是否在 HQL 中得到重复项。

关于mysql - 当按 EnumType.ORDINAL 排序时,HQL 在简单查询中返回重复实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39878550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com