通过EnumType.ORDINAL

时间:2016-10-05 15:49:42

标签: mysql hibernate enums hql

我试图在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;
    }
}

1 个答案:

答案 0 :(得分:1)

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

因此,如果这有助于其他任何人,请检查您的equals(Object o)方法,如果您在HQL中获得重复项。