HQL连接Hibernate 5.2 / Spring 4.3上的重复记录(没有急切的提取,映射到Set,只有内部连接)

时间:2017-11-02 19:01:39

标签: spring hibernate join annotations hql

你好。 看起来这个问题可能是之前提出的,但我在互联网上看不出这个具体案例的答案。 这是我的出发点: 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>

1 个答案:

答案 0 :(得分:0)

我猜这就是Hibernate 5的工作方式。如果您使用的是HQL,则必须使用&#34; distinct&#34;所有查询中的关键字,以便得到不重复的结果(它工作正常,没有发生重大问题)。