Search code examples
javajpanamed-query

Using JPA NamedQuery to obtain result list


I want to get a list of results using the query as below:

SELECT x FROM XTreinamentosOrc x WHERE x.codEduca NOT IN (SELECT DISTINCT y.codCurso y FROM XRlz y WHERE y.matricula = :matricula)

I have used it in its entity class, but then I've got the Exception:

Caused by: javax.el.PropertyNotFoundException: The class 'br.com.bb.upb.diage.atb_treinamentos.entities.XTreinamentosOrc' does not have the property 'matricula'.

The matricula field is obtained when the user successfully logs in the app. It should be setted in the NamedQuery via CDI to query the database. The matricula field is located in another table different from the one mapped here.

How can I set the injected sessionChave String in parameter matricula, which is of XRlzConsolidado class type?

The bean:

@Named(value = "ExtratoBean")
@RequestScoped
public class ExtratoBean implements Serializable {

@EJB
private XTreinamentosOrcFacade xt;

@Inject
@SessionChave
private String sessionChave;

private List<XTreinamentosOrc> xTreinamentosOrcList;

public List<XTreinamentosOrc> getxTreinamentosOrcList() {
    return QueryExtratoTreinamentos();
}

private List QueryExtratoTreinamentos() {
    List<XTreinamentosOrc> extratoTreinamentosOrcList = null;
    XRlzConsolidado x = new XRlzConsolidado();
    x.setMatricula(sessionChave);
    extratoTreinamentosOrcList = xt.findAllTreinamentosByMatricula(x);
    return extratoTreinamentosOrcList;
}
}

There are 3 entities: XRlz, XRlzConsolidado and XTreinamentosOrc.

The XRlz:

@Entity
@Table(name = "XRlz", catalog = "diage", schema = "atb")
@XmlRootElement
//named queries

public class XRlz implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "id")
private Integer id;
@Size(max = 100)
@Column(name = "nome")
private String nome;
@Column(name = "uorPos")
private Integer uorPos;
@Size(max = 100)
@Column(name = "nomeUorPos")
private String nomeUorPos;
@Column(name = "codCurso")
private Integer codCurso;
@Size(max = 100)
@Column(name = "nomeCurso")
private String nomeCurso;
@Column(name = "qtdCursos2015")
private Integer qtdCursos2015;
@Size(max = 10)
@Column(name = "dtConclusao")
private String dtConclusao;
@JoinColumn(name = "matricula", referencedColumnName = "matricula")
@ManyToOne
private XRlzConsolidado matricula;
@JoinColumn(name = "dtRef", referencedColumnName = "id")
@ManyToOne
private XDatas dtRef;

//GETTERS AND SETTERS

public XRlzConsolidado getMatricula() {
    return matricula;
}

public void setMatricula(XRlzConsolidado matricula) {
    this.matricula = matricula;
}

public XDatas getDtRef() {
    return dtRef;
}

public void setDtRef(XDatas dtRef) {
    this.dtRef = dtRef;
}

//equals/hashcode/toString 

}

The XRlzConsolidado:

@Entity
@Table(name = "XRlzConsolidado", catalog = "diage", schema = "atb")
@XmlRootElement
// NamedQueries

public class XRlzConsolidado implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 8)
    @Column(name = "matricula")
    private String matricula;
    @Size(max = 100)
    @Column(name = "nome")
    private String nome;
    @Column(name = "uorPos")
    private Integer uorPos;
    @Size(max = 100)
    @Column(name = "nomeuorPos")
    private String nomeuorPos;
    @Column(name = "capacitacaoGestores")
    private Integer capacitacaoGestores;
    @Column(name = "capacitacaoAssessores")
    private Integer capacitacaoAssessores;
    @Column(name = "horas")
    private Integer horas;
    @Column(name = "bemEstar")
    private Integer bemEstar;
    @Column(name = "inovEfic")
    private Integer inovEfic;
    @Column(name = "qtdCursos2015")
    private Integer qtdCursos2015;
    @OneToMany(mappedBy = "matricula")
    private Collection<XRlz> xRlzCollection;

    public XRlzConsolidado() {
    }

    public XRlzConsolidado(String matricula) {
        this.matricula = matricula;
    }

    public String getMatricula() {
        return matricula;
    }

    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }

// getters and setters

    @XmlTransient
    public Collection<XRlz> getXRlzCollection() {
        return xRlzCollection;
    }

    public void setXRlzCollection(Collection<XRlz> xRlzCollection) {
        this.xRlzCollection = xRlzCollection;
    }

    // hashCode()

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof XRlzConsolidado)) {
            return false;
        }
        XRlzConsolidado other = (XRlzConsolidado) object;
        if ((this.matricula == null && other.matricula != null) || (this.matricula != null && !this.matricula.equals(other.matricula))) {
            return false;
        }
        return true;
    }

    // toString
}

The XTreinamentosOrc:

@Entity
@Table(name = "XTreinamentosOrc", catalog = "diage", schema = "atb")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "XTreinamentosOrc.findAll", query = "SELECT x FROM XTreinamentosOrc x"),
@NamedQuery(name = "XTreinamentosOrc.findAllTreinamentosByMatricula", query = "SELECT x FROM XTreinamentosOrc x WHERE x.codEduca NOT IN (SELECT DISTINCT y.codCurso FROM XRlz y WHERE y.matricula = :matricula)")})

public class XTreinamentosOrc implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @NotNull
    @Column(name = "codEduca")
    private int codEduca;
    @Size(max = 100)
    @Column(name = "nomeCurso")
    private String nomeCurso;
    @Column(name = "cargaHoraria")
    private Integer cargaHoraria;
    @JoinColumn(name = "tipo", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private XTipo tipo;
    @JoinColumn(name = "segmento", referencedColumnName = "id")
    @ManyToOne(optional = false)
    private XSegmento segmento;
    @JoinColumn(name = "modalidade", referencedColumnName = "id")
    @ManyToOne
    private XModalidade modalidade;
    @JoinColumn(name = "dtRef", referencedColumnName = "id")
    @ManyToOne
    private XDatas dtRef;

    public XTreinamentosOrc() {
    }

    public XTreinamentosOrc(Integer id) {
        this.id = id;
    }

    public XTreinamentosOrc(Integer id, int codEduca) {
        this.id = id;
        this.codEduca = codEduca;
    }

    // hashCode() {

    @Override
    public boolean equals(Object object) {
        if (!(object instanceof XTreinamentosOrc)) {
            return false;
        }
        XTreinamentosOrc other = (XTreinamentosOrc) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }
    }

Thanks in advance.


Solution

  • Could you post code for XRlzConsolidado? It probably contains a string field you want to compare with sessionChave. You are comparing field XRlz.matricula with string value, but it is of type XRlzConsolidado