你好。 看起来这个问题可能是之前提出的,但我在互联网上看不出这个具体案例的答案。 这是我的出发点: HQL加入Hibernate 5.2 / Spring 4.3上的重复记录。这是一个简单的多对一/一对多映射:我有我的Root实体(Usuarios)和我的Child实体(Perfiles)。 我尝试使用Oracle 11和MySQL 5的简单示例,它总是重复根实体结果。如果它必须是这样的话我不会...我怀疑它(我不是Hibernate的新手)
配置没问题我已经多次修改了它。 这个简单的HQL的问题在于它为每个子节点(Perfiles)重复对象Usuarios,所以如果我有一个带有3个Perfiles的Usuario,它会出现3次。
没有左连接,没有EAGER提取,Usuarios正在映射到一组Perfiles。一切都是alrigth !!!!!我不敢相信它正在重复记录。当然如果我把它放在那里,我得到一个简单的对象Usuarios(这就是我想要的当然),完美地填充它的集合和subObjetc ..就像Perfiles。但我无法找到它为什么这样做,如果我必须在HQL中编写distinc,那就必定是错误的。 这是我的两个对象:
<pre><code>
select u from Usuarios u
inner join u.perfiles p
@Entity
@Table(name = "usuarios")
public class Usuarios implements java.io.Serializable {
private int usuarioId;
private TcTiposDocumentos tcTiposDocumentos;
private Usuarios usuarioAlta;
private Usuarios usuarioUltModif;
private Usuarios usuarioBaja;
private String nombreApellidos;
private String email;
private String numTelefono;
private Set<Perfiles> perfiles = new HashSet<Perfiles>(0);
public Usuarios() {
}
@Id
@Column(name = "USUARIO_ID", unique = true, nullable = false)
public int getUsuarioId() {
return this.usuarioId;
}
public void setUsuarioId(int usuarioId) {
this.usuarioId = usuarioId;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COD_TIPO_DOCUMENTO", nullable = false)
public TcTiposDocumentos getTcTiposDocumentos() {
return this.tcTiposDocumentos;
}
public void setTcTiposDocumentos(TcTiposDocumentos tcTiposDocumentos) {
this.tcTiposDocumentos = tcTiposDocumentos;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COD_USUARIO_BAJA")
public Usuarios getUsuarioBaja() {
return this.usuarioBaja;
}
public void setUsuarioBaja(Usuarios ub) {
this.usuarioBaja = ub;
}
@OneToMany(fetch = FetchType.LAZY, mappedBy = "usuarios")
public Set<Perfiles> getPerfiles() {
return this.perfiles;
}
public void setPerfiles(Set<Perfiles> perfileses) {
this.perfiles = perfileses;
}
}
//CHILD ENTITY
Entity
@Table(name = "perfiles")
public class Perfiles implements java.io.Serializable {
private int perfilId;
private ComunidadesRegante comunidadesRegante;
private TcRoles tcRoles;
private Usuarios usuarios;
public Perfiles() {
}
public Perfiles(int perfilId, TcRoles tcRoles, Usuarios usuarios) {
this.perfilId = perfilId;
this.tcRoles = tcRoles;
this.usuarios = usuarios;
}
public Perfiles(int perfilId, ComunidadesRegante comunidadesRegante, TcRoles
tcRoles, Usuarios usuarios) {
this.perfilId = perfilId;
this.comunidadesRegante = comunidadesRegante;
this.tcRoles = tcRoles;
this.usuarios = usuarios;
}
@Id
@Column(name = "PERFIL_ID", unique = true, nullable = false)
public int getPerfilId() {
return this.perfilId;
}
public void setPerfilId(int perfilId) {
this.perfilId = perfilId;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COD_USUARIO", nullable = false)
public Usuarios getUsuarios() {
return this.usuarios;
}
public void setUsuarios(Usuarios usuarios) {
this.usuarios = usuarios;
}
}
</code></pre>
答案 0 :(得分:0)
我猜这就是Hibernate 5的工作方式。如果您使用的是HQL,则必须使用&#34; distinct&#34;所有查询中的关键字,以便得到不重复的结果(它工作正常,没有发生重大问题)。