在实现ManyToMany关联时,有没有办法在列表中获取唯一元素?

时间:2016-06-07 03:28:21

标签: java mysql hibernate java-ee collections

我有 Language 实体。我希望与同一个表格实现ManyToMany关联。 translation_ways表只有两个字段fromLangId int(3)toLangId int(3)

@Entity(name = "Language")
@Table(name = "language")
public class Language implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "language_id")
    private int id;

    @NotBlank
    @Column(name = "short_name", unique = true, length = 2, nullable = false)
    private String shortName;

    @NotBlank
    @Column(name = "full_name", unique = true, nullable = false)
    private String fullName;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "translation_ways",
        joinColumns = @JoinColumn(name = "fromLangId"),
        inverseJoinColumns = @JoinColumn(name = "toLangId"))
    private Set<Language> toLangs;

    //getters and setters here
    //ovverrided equals() & hashCode()
}

我想要做的是获取所有语言的列表(使用translation_ways表加入的语言实体集)。问题是Criteria.list()返回带有重复项的列表。列表中重复项的数量等于当前ID在translation_ways.fromLangId列中显示的次数。在我的情况下,它是冗余信息,我想获得唯一对象的列表。

所以第一个问题是,是否有一些推荐的或最好的方法来获得没有冗余元素的列表?将返回的ArrayList转换为LinkedHashSet?或者我可能只是对Criteria ???

做错了

另外,还有一个相关的问题。如果我第二次调用这个查询,hibernate将从缓存中获取数据,我是对的吗?

我将感谢任何建议,想法,链接和帮助。提前谢谢大家。

我的要求:

Criteria c = this.template.getSessionFactory().getCurrentSession().createCriteria(Language.class);
    c.setCacheable(true)
        .setCacheMode(CacheMode.NORMAL)
        .setCacheRegion("staticLangList");
List<Language> ls = c.list();
return ls;

P.S。 Hibernate版本是5.0.1.Final。

1 个答案:

答案 0 :(得分:0)

setResultTransformer中使用Criteria以避免重复。

c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);