Tengo una tabla ,dicen, Instrumento con el ID,Estado, y User_ID como columnas.

Así que tengo este JPA consulta para devolver todos los instrumentos de registros con un juego
User_ID.

   query = manager.createQuery("SELECT instrument from Instrument instrument
             where instrument.User_ID=:User_ID",Instrument.class);
   query.setParameter("User_ID", User_ID);

   List<Instrument> instruments=  query.getResultList();

   for(Instrument instrument:instruments){
            System.out.println("Instrument ID  "+instrument.getID());
              //using sysout as it is not prod code yet
        }

Es solo devuelve el primer registro de repetirse tantas veces como registros coincidentes.

11:13:01,703 INFO  [stdout] (http-/127.0.0.1:8080-1) Instrument ID   1
11:13:01,704 INFO  [stdout] (http-/127.0.0.1:8080-1) Instrument ID   1
11:13:01,704 INFO  [stdout] (http-/127.0.0.1:8080-1) Instrument ID   1

Tengo tres registros en la base de datos con el instrumento de los Identificadores de 1,2, y 3

Me permitió mostrar consulta sql en hibernate y la consulta se ejecuta correctamente en la Base de datos directamente
y devuelve distintos registros.

De Consulta De Hibernate:

    select instrumentjdo0_.User_ID as member_U1_0_, instrumentjdo0_.ID as ID2_0_, 
instrumentjdo0_.state as state4_0_ from instrument instrumentjdo0_ where instrumentjdo0_.User_ID=?

Instrumento De La Entidad

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;




@Entity
@Table(name = "instrument")
public class Instrument{

    @Id
    @Column(name="User_ID", length=9, unique=true, nullable=false)
    String user_ID;

    @Column(name="ID",nullable=false)
    String ID;


    @Column(name="state",nullable=false)
    String state;

    public String getID() {
        return ID;
    }

    public void setID(String ID) {
        this.ID = ID;
    }

    public String getUserID() {
        return user_ID;
    }

    public void setUserID(String userID) {
        this.user_ID = userID;
    }


    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

No está seguro de lo que me estoy perdiendo.

  • parece que se han publicado equivocado Consulta en tu pregunta, comprobar una vez más –> User_ID=: «user_ID», <– ¿por qué tiene doble cita aquí?
  • sí tienes razón..fija! gracias!
  • Puedes añadir la consulta generada por hibernate a su pregunta.
  • He añadido la consulta de hibernate demasiado
  • ok, la consulta se ve bien. Ahora, ¿cómo puede usted decir que la consulta está volviendo mismo registro varias veces? Cómo se iteración en la lista, por favor, puedes agregar ese código también?
  • He añadido el código iteración
  • Cuando se ejecuta el sql de la consulta directa a la base de datos devuelve 1 línea?
  • Por favor, agregue el código fuente de Instrumento de la entidad.
  • no se devuelve todos 3 los registros correctamente
  • Yo creo saber el problema es .. @ID debe ser añadido para el campo ID y no el campo User_ID como User_ID es la clave externa ?

2 Comentarios

  1. 11

    El problema era que el mal de la columna en el Instrumento de la Entidad tenido la @ID atributo asignado.

    Me lo sacó de User_ID, y Agregó ID y funcionó bien.

    • Pero eso no va a resultar en la repetición de registros mientras se ejecuta su derecho de consulta, así que cualquier registro en la DB tiene los mismos valores para User_ID?
    • sí, todos los registros que están asociados con el mismo usuario tienen el mismo User_ID.
    • ah ok, entonces, esta afirmación es engañosa en su pregunta — I enabled show sql query on hibernate and the query runs fine on the Database directly and returns distinct records.
    • es sorprendente que la devolución que hizo distintos registros. Creo que hibernate no devolver directamente el conjunto de resultados y no de algún tipo de procesamiento sobre los resultados basados en @ID, etc.
    • Tengo el mismo problema pero yo no tenía una alternativa columna en la que poner el @Id así que he creado una nueva columna.
  2. 5

    También me había enfrentado a una misma cuestión.
    De contacto en la tabla i, marcado con el firstname columna como @Id.
    Y la mesa había varias filas con el mismo firstname debido a que la primera fila de registro con el mismo firstname estaba recibiendo duplicado en todo el conjunto de resultados.
    Para resolver este problema he hecho IdClass con nombre y apellido como atributo id e importados como identificación de la clase en mi bean.
    Desde firstname y lastname juntos forman una combinación única, que resolvió mi problema.

    Idclass de la siguiente

    public class ContactKey implements Serializable{
    
        protected String firstName;
        protected String lastName;
    
        public boolean equals(final Object inObject) {
            if (null != inObject) {
                if (inObject.getClass().equals(this.getClass())) {
                    CqCamAdminKey siteKey = (CqCamAdminKey) inObject;
                    return (null != this.getFirstName() && this.getFirstName().equals(siteKey.getFirstName()) && null != this.getLastName() && this.getLastName().equals(siteKey.getLastName()));
                }
            }
            return super.equals(inObject);
        }
    
        public int hashCode() {
            if (this.getFirstName() != null && this.getLastName() != null) {
                return this.getFirstName().hashCode() + this.getLastName().hashCode();
            }
            return super.hashCode();
        }
    }

    clase de bean de la siguiente

    @IdClass(contactKey.class)
    public abstract class CqCamAdminDataBean implements DataModelConstants{
    
        private static final long serialVersionUID = 7686374823515894764L;
    
        @Id
        @JsonIgnore
        @XmlTransient
        @Column(name = FIRST_NAME)
        protected String firstName;
    
    
        @Id
        @JsonIgnore
        @Column(name = LAST_NAME)
        protected String lastName;
    
    }

Dejar respuesta

Please enter your comment!
Please enter your name here