Que query lanzaste en HeidiSQL?
¿Esta?
Código Java:
Ver originalSELECT t0.IDRegistro, t0.IDEstado, t0.NLineasFijo, t0.NLineasMovil, t1.cif, t1.codigoPostal, t1.comentarios, t1.concertador, t1.direccion, t1.email, t1.gerente, t1.id, t1.lineasFijo, t1.lineasMovil, t1.localidad, t1.nombreRazonSocial, t1.numeroCuenta, t1.operadorFijo, t1.operadorMovil, t1.permanenciaFijo, t1.permanenciaMovil, t1.personaContacto, t1.provincia, t1.segmento, t1.telefono, t1.telefonoContacto, t1.telefonos, t0.comentarios, t0.concertador, t0.fechaCreacion, t0.fechaModificacion, t0.nombreEstado, t0.operadorFijo, t0.operadorMovil, t0.origen, t0.permanenciaFijo, t0.permanenciaMovil FROM registros t0 LEFT OUTER JOIN Cliente t1 ON t0.DNICLiente = t1.cif WHERE (NOT (t0.IDEstado = ?) AND t0.IDEstado IS NOT NULL)
o esta
Código Java:
Ver originalSELECT pro FROM Registro pro WHERE pro.IDEstado NOT IN (20)
Te lo comento porque son distinstas querys, en la primera, por cada registro te estás trayendo su cliente, en las relaciones OneToOne, por defecto el FetchType es EAGER, y JPA irá a buscar cada cliente por cada registro que tengas en BBDD.
Si estas ejecutando la segunda query, solo estás recuperando los registros.
Independientemente de esto, y recapitulando, en vez de hacer un merge, que te va a realizar la SELECT + UPDATE, puedes utilizar NamedQuery, las namedQuery se suelen definir en los Entity, creas una namedQuery que haga la UPDATE directamente, te saltas la SELECT y a correr jeje.
Lo he escrito a pelo, sin IDE, puede escaparseme algun caracter.
Código Java:
Ver originalQuery query = em.createNamedQuery("nombreNamedQuery");
query.setParameter("miParametro", miValor);
quer.executeUpdate();
Saludos.