1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Problema com consulta: Objeto Pai sempre lista todos Filhos e não os Filhos do filtro

Olá Pessoal,

estou com o seguinte problema. Ao consultar uma entidade Pai adicionando uma condição do Filho o JPA sempre me retorna o Pai e todos seus Filhos. O que necessito é que no resultado o Pai contenha uma lista com os filhos que atendem a condição. Segue abaixo os códigos e o resultado errado e certo.

Minha Entitys

@Entity
@Table(name = "EMPLOYEE")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Employee.findAll", query = "SELECT e FROM Employee e"),
    @NamedQuery(name = "Employee.findByEmplId", query = "SELECT e FROM Employee e WHERE e.emplId = :emplId"),
    @NamedQuery(name = "Employee.findByEmplIdAndDepId", query = "SELECT e FROM Employee e INNER JOIN e.dependentList de WHERE e.emplId = :emplId and de.depId = :depId")})
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "EMPL_ID")
    private Short emplId;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 20)
    @Column(name = "LAST_NAME")
    private String lastName;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 20)
    @Column(name = "FIRST_NAME")
    private String firstName;
    @Basic(optional = false)
    @NotNull
    @Column(name = "GENDER")
    private Character gender;
    @Basic(optional = false)
    @NotNull
    @Column(name = "HIREDATE")
    @Temporal(TemporalType.DATE)
    private Date hiredate;
    // @Max(value=?)  @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
    @Column(name = "SALARY")
    private BigDecimal salary;
    @JoinColumn(name = "DEPT_ID", referencedColumnName = "DEPT_ID")
    @ManyToOne(optional = false)
    private Department deptId;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "emplId", fetch = FetchType.LAZY)
    private List<Dependent> dependentList;

    //Get e Set

}
@Entity
@Table(name = "DEPENDENT")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Dependent.findAll", query = "SELECT d FROM Dependent d"),
    @NamedQuery(name = "Dependent.findByDepId", query = "SELECT d FROM Dependent d WHERE d.depId = :depId"),
    @NamedQuery(name = "Dependent.findByDepName", query = "SELECT d FROM Dependent d WHERE d.depName = :depName")})
public class Dependent implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Column(name = "DEP_ID")
    private Short depId;
    @Size(max = 20)
    @Column(name = "DEP_NAME")
    private String depName;
    @JoinColumn(name = "EMPL_ID", referencedColumnName = "EMPL_ID")
    @ManyToOne(optional = false, fetch = FetchType.LAZY)
    private Employee emplId;

    //Get e Set

}

Meu DAO

  public Employee consultar(int idEmp, int idDep) {
        return (Employee) this.em.createNamedQuery("Employee.findByEmplIdAndDepId")
                .setParameter("emplId", idEmp)
                .setParameter("depId", idDep)
                .getSingleResult();
  }

Meu test

   @Test
    public void test_consultar_idEmp_iDep() {
        System.out.println("consultar");
        int idEmp = 2;
        int idDep = 2;
        EmployeeDAO instance = new EmployeeDAO(this.entitymanager);
        Employee employee = instance.consultar(idEmp, idDep);
        String expResult = "DEP2";
        String result = employee.getDependentList().get(0).getDepName();
        assertEquals(expResult, result);

    }

Resultados:

Errado https://www.filepicker.io/api/file/Zg0rBQwmss3LGYSIHgnv Certo https://www.filepicker.io/api/file/PcbykQyyQGCvMz50elBG

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags jpa java-ee java ou faça a sua própria pergunta.