我试图在Spring MVC中使用Hibernate HQL获取实体列表。查询如下所示:
SELECT m FROM MyEntity m where property =:property ORDER BY otherProperty desc
问题在于,即使在DISTINCT
之后添加SELECT
关键字,我也会获得大量重复结果(相同的ID和Java哈希)。 这只发生,其中枚举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;
}
}
答案 0 :(得分:1)
equals(Object o)
类中的MyEntity
方法无法正常工作,因此Java无法实际告诉另一个实体。修复了那部分,解决了整个问题。
因此,如果这有助于其他任何人,请检查您的equals(Object o)
方法,如果您在HQL中获得重复项。