java - 如何防止 Hibernate 中的重复结果?

标签 java hibernate criteria hibernate-criteria

尝试搜索关系的多个值时,会返回重复的结果。

我怎样才能避免这些重复?

我们的服务有一个方法可以构建 Criteria :

@Override
protected Criteria createCriteria(Map<String, Object> values) {
    Criteria criteria = super.createCriteria(values);
    if (criteria != null && values != null) {

        // other criteria restrictions

        Set<MDTErkenning> erkenningen = (Set<MDTErkenning>) values.get("erkenningen");
        if (erkenningen != null && !erkenningen.isEmpty()) {
            criteria.createAlias("erkenningen", "erkenningen");
            criteria.add(Restrictions.in("erkenningen." + CollectionPropertyNames.COLLECTION_ELEMENTS, erkenningen));
        }

    }
    return criteria;
}

用于获取分页结果并进行计数:

@Override
public List<T> findByCriteria(Map<String, Object> values, int offset, int amount) {
    Criteria criteria = createCriteria(values)
            .setFirstResult(offset)
            .setMaxResults(amount);
    return criteria.list();
}

@Override
public Long getCount(Map<String, Object> values) {
    Criteria criteria = createCriteria(values).setProjection(Projections.rowCount());
    return (Long) criteria.uniqueResult();
}

主要实体

@Entity
@Table(name = "mdt")
public class MultiDisciplinairTeam {

    @Id
    @Column(name = "mdt_uuid")
    private String id;

    // other mappings

    @Column(name = "erkenning")
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    @ElementCollection(fetch = FetchType.EAGER)
    @Enumerated(EnumType.STRING)
    @JoinTable(name = "mdt_erkenning", joinColumns = {@JoinColumn(name = PK_NAME)})
    @Fetch(FetchMode.SELECT)
    private Set<MDTErkenning> erkenningen;

    // getters & setters 

}

枚举而不是实体

public enum MDTErkenning {
    ZORG("Zorg"),
    IMB("IMB"),
    PAB("PAB"),
    ROLSTOELEN("Rolstoelen");

    private String beschrijving;

    private MDTErkenning(String beschrijving) {
        this.beschrijving = beschrijving;
    }

    public String getBeschrijving() {
        return this.beschrijving;
    }
}

连接表 mdt_erkenning一些数据:

------------------------
| mdt_uuid | erkenning |
------------------------
| <id 1>   | ZORG      |
| <id 1>   | PAB       |
| <id 2>   | ZORG      |
| <id 2>   | IMB       |
------------------------

所以如果我查询例如。 ZORG 和 PAB 我得到了我的实体的 3 个实例:2 个 <id 1>和 1 个 <id 2> .

我想把结果列表放在 Set 中消除重复项,但分页不再正确。

我该怎么办?

最佳答案

尝试添加 setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 以删除重复的条目和 setProjection(Projections.distinct(Projections.property("id"))) 以获取正确的行在创建条件对象时计数。

关于java - 如何防止 Hibernate 中的重复结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22012871/

相关文章:

hibernate - 如何在Hibernate中使用限制和标准来实现 "not in"?

Java 泛型 - 如何将非泛型添加到泛型列表

java - 如何在android上制作一个按下和释放的自定义按钮?

jpa - 如何将集合/列表设置为 JPA 条件查询的命名参数?

java - 以编程方式添加实体时出现 MappingNotFound 异常

java - 无法进行单元测试 - Unitils、Hibernate

java - 列表的 Hibernate 标准

java - 备用java语言

java.lang.OutOfMemoryError 使用多任务画廊

java - 如何使用 openNLP 将以下标记化文本与数据库列值进行比较?