Mysql 按EnumType.ORDINAL排序时,HQL在简单查询中返回重复的实体
我试图在SpringMVC中使用HibernateHQL获取实体列表。查询如下所示:Mysql 按EnumType.ORDINAL排序时,HQL在简单查询中返回重复的实体,mysql,hibernate,enums,hql,Mysql,Hibernate,Enums,Hql,我试图在SpringMVC中使用HibernateHQL获取实体列表。查询如下所示: SELECT m FROM MyEntity m where property =:property ORDER BY otherProperty desc @Entity @Table(name="my_entity") public class MyEntity extends BaseEntity<Long> { private static final long serialVe
SELECT m FROM MyEntity m where property =:property ORDER BY otherProperty desc
@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;
(...)
}
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;
}
}
问题是,即使在SELECT
关键字之后添加DISTINCT
关键字,我也会得到大量重复的结果(相同的ID和Java哈希)这种情况只发生在enumOtherProperty
排序的地方,它在MySQL中存储为ORDINAL
(int)。我尝试过使用标准和其他方法,总是发现这样的问题
这个问题有简单的解决办法吗?将枚举移动到枚举类型字符串是我想考虑的最后一个选项,因为它涉及重构数据库,但我想听听关于这一点的建议,如果这是您能想到的唯一选项。
MyEntity实体如下所示:
SELECT m FROM MyEntity m where property =:property ORDER BY otherProperty desc
@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;
(...)
}
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中获得了重复的方法。尝试以下操作:query.setResultTransformer(CriteriaSpecification.DISTINCT\u ROOT\u ENTITY);对不起,我刚试过。与添加distinct
sql子句一样,它仍然返回相同的重复项。我认为这是一个错误,因为SQL语句非常简单,没有连接,所以它应该只返回每一行一次。