我有 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。
答案 0 :(得分:0)
在setResultTransformer
中使用Criteria
以避免重复。
c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);