2014-02-25 33 views
2

當試圖搜索關係的多個值時,會返回重複結果。如何在Hibernate中防止重複結果?

我該如何避免這些重複?

我們有建立在我們的服務的方法的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 

} 

如果我查詢如因此

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

:枚舉,而不是實體

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。 ZORG和PAB我得到3個實例我的實體:2與<id 1>和1與<id 2>

我想將結果列表放在Set中,以消除重複,但分頁不再正確。

我應該怎麼辦?

回答

0

嘗試添加setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)刪除重複條目和setProjection(Projections.distinct(Projections.property("id")))獲取正確的行數,同時創建條件對象。

+0

不起作用:刪除重複但計數仍然錯誤。 – Koohoolinn

+0

@Koohoolinn嘗試編輯答案 –

+0

仍然不起作用:'createCriteria(values).setProjection(Projections.distinct(Projections.property(「id」)))。setProjection(Projections.rowCount())。uniqueResult(); '返回3。 – Koohoolinn

3

嘗試使用此投影:

.setProjection(Projections.countDistinct("id")) 

對於示例:

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

我使用Hibernate 4.3.6.Final。