Pessoal,
Estou trabalhando com JPA pela primeira vez e estou com dificuldades para realizar um select passando parâmetros (usar o where). Tentei fazer de acordo com o código abaixo (exemplo encontrado na internet), mas na hora de setar o Path está dando erro (IllegalArgumentException).
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery();
cq.select(cq.from(TbTranTransacao.class));
Root root = cq.from(TbTranTransacao.class);
for (Object objKey : params.keySet()) {
Path att = root.get(objKey.toString());
cq.where(cb.equal(att, params.get(objKey)));
}
Query q = em.createQuery(cq);
q.setMaxResults(maxResults);
q.setFirstResult(firstResult);
return q.getResultList();
Exception in thread "main" java.lang.IllegalArgumentException: The attribute [TRAN_FL_ATIVA] from the managed type [EntityTypeImpl@25934689:TbTranTransacao [ javaType: class br.com.banestes.sonda.jpa.entity.TbTranTransacao descriptor: RelationalDescriptor(br.com.banestes.sonda.jpa.entity.TbTranTransacao --> [DatabaseTable(tb_tran_transacao)]), mappings: 6]] is not present.
at org.eclipse.persistence.internal.jpa.metamodel.ManagedTypeImpl.getAttribute(ManagedTypeImpl.java:137)
at org.eclipse.persistence.internal.jpa.querydef.FromImpl.get(FromImpl.java:312)
at br.com.banestes.sonda.jpa.controller.TbTranTransacaoJpaController.findTbTranTransacaoEntitiesByCriteria(TbTranTransacaoJpaController.java:247)
at br.com.banestes.sonda.jpa.controller.TbTranTransacaoJpaController.findTbTranTransacaoEntitiesByCriteria(TbTranTransacaoJpaController.java:229)
Já verifiquei o nome da coluna e está correto, não sei mais o que pode ser. Para falar a verdade eu não entendi bem o que essa exception quer dizer.
Agora estou trabalhando na mesma solução porém usando o createQuery com o SQL do JPA, mas acredito que exista uma forma nativa (a que tentei acima) muito mais intuitiva de usar.
Help…
Olá, poste por favor o código da classe br.com.banestes.sonda.jpa.entity.TbTranTransacao para darmos uma olhada.
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name = "tb_tran_transacao")
@NamedQueries({
@NamedQuery(name = "TbTranTransacao.findAll", query = "SELECT t FROM TbTranTransacao t"),
@NamedQuery(name = "TbTranTransacao.findByTranCdTransacao", query = "SELECT t FROM TbTranTransacao t WHERE t.tranCdTransacao = :tranCdTransacao"),
@NamedQuery(name = "TbTranTransacao.findByTranFlIb", query = "SELECT t FROM TbTranTransacao t WHERE t.tranFlIb = :tranFlIb"),
@NamedQuery(name = "TbTranTransacao.findByTranFlAtiva", query = "SELECT t FROM TbTranTransacao t WHERE t.tranFlAtiva = :tranFlAtiva"),
@NamedQuery(name = "TbTranTransacao.findByTranUrlTransacao", query = "SELECT t FROM TbTranTransacao t WHERE t.tranUrlTransacao = :tranUrlTransacao")})
public class TbTranTransacao implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "TRAN_CD_TRANSACAO")
private Integer tranCdTransacao;
@Basic(optional = false)
@Column(name = "TRAN_FL_IB")
private boolean tranFlIb;
@Basic(optional = false)
@Column(name = "TRAN_FL_ATIVA")
private boolean tranFlAtiva;
@Basic(optional = false)
@Column(name = "TRAN_URL_TRANSACAO")
private String tranUrlTransacao;
@JoinColumn(name = "TRAN_CD_TIPO", referencedColumnName = "TPS_CD_SERVICO")
@ManyToOne(optional = false)
private TbTpsTipoServico tranCdTipo;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "tbTranTransacao")
private Collection<TbParTranParametrosTransacoes> tbParTranParametrosTransacoesCollection;
public TbTranTransacao() {
}
public TbTranTransacao(Integer tranCdTransacao) {
this.tranCdTransacao = tranCdTransacao;
}
public TbTranTransacao(Integer tranCdTransacao, boolean tranFlIb, boolean tranFlAtiva, String tranUrlTransacao) {
this.tranCdTransacao = tranCdTransacao;
this.tranFlIb = tranFlIb;
this.tranFlAtiva = tranFlAtiva;
this.tranUrlTransacao = tranUrlTransacao;
}
public Integer getTranCdTransacao() {
return tranCdTransacao;
}
public void setTranCdTransacao(Integer tranCdTransacao) {
this.tranCdTransacao = tranCdTransacao;
}
public boolean getTranFlIb() {
return tranFlIb;
}
public void setTranFlIb(boolean tranFlIb) {
this.tranFlIb = tranFlIb;
}
public boolean getTranFlAtiva() {
return tranFlAtiva;
}
public void setTranFlAtiva(boolean tranFlAtiva) {
this.tranFlAtiva = tranFlAtiva;
}
public String getTranUrlTransacao() {
return tranUrlTransacao;
}
public void setTranUrlTransacao(String tranUrlTransacao) {
this.tranUrlTransacao = tranUrlTransacao;
}
public TbTpsTipoServico getTranCdTipo() {
return tranCdTipo;
}
public void setTranCdTipo(TbTpsTipoServico tranCdTipo) {
this.tranCdTipo = tranCdTipo;
}
public Collection<TbParTranParametrosTransacoes> getTbParTranParametrosTransacoesCollection() {
return tbParTranParametrosTransacoesCollection;
}
public void setTbParTranParametrosTransacoesCollection(Collection<TbParTranParametrosTransacoes> tbParTranParametrosTransacoesCollection) {
this.tbParTranParametrosTransacoesCollection = tbParTranParametrosTransacoesCollection;
}
@Override
public int hashCode() {
int hash = 0;
hash += (tranCdTransacao != null ? tranCdTransacao.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof TbTranTransacao)) {
return false;
}
TbTranTransacao other = (TbTranTransacao) object;
if ((this.tranCdTransacao == null && other.tranCdTransacao != null) || (this.tranCdTransacao != null && !this.tranCdTransacao.equals(other.tranCdTransacao))) {
return false;
}
return true;
}
@Override
public String toString() {
return "br.com.banestes.sonda.jpa.entity.TbTranTransacao[tranCdTransacao=" + tranCdTransacao + "]";
}
}
Descobri o problema. Quando eu tentava setar o path estava passando o nome da coluna na tabela e não o nome do atributo do entity.