【发布时间】: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);
-
抱歉,刚试了。就像添加
distinctsql 子句一样,它仍然返回相同的重复项。我认为这是一个错误,因为 SQL 语句非常简单,没有连接,它应该只返回每一行一次。