當試圖搜索關係的多個值時,會返回重複結果。如何在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
中,以消除重複,但分頁不再正確。
我應該怎麼辦?
不起作用:刪除重複但計數仍然錯誤。 – Koohoolinn
@Koohoolinn嘗試編輯答案 –
仍然不起作用:'createCriteria(values).setProjection(Projections.distinct(Projections.property(「id」)))。setProjection(Projections.rowCount())。uniqueResult(); '返回3。 – Koohoolinn