marcelo.bellissimo:
Leozin:
Fala Kleber
Ao invéz de usar LIKE, use EQ("cod_programa", id). Vê aí se funciona :)
Eu acho que não vai adiantar muito, mas de qualquer jeito vale a tentativa...
Só pra constar, Kleber, eu simulei aqui usando as suas classes e um BD em Postgre com o seu Script de create, e funcionou tudo normalmente... :?
Poisé marcelo... num sei q p#@#$ é essa...
Vamos do começo... minhas tabelas:
-- Table: programa
-- DROP TABLE programa;
CREATE TABLE programa
(
cod_programa bigint NOT NULL,
nome character varying(255),
CONSTRAINT programa_pkey PRIMARY KEY (cod_programa)
)
WITH (OIDS=FALSE);
ALTER TABLE programa OWNER TO postgres;
-- Table: servico
-- DROP TABLE servico;
CREATE TABLE servico
(
cod_servico bigint NOT NULL,
nome character varying(255),
programa_cod_programa bigint,
CONSTRAINT servico_pkey PRIMARY KEY (cod_servico),
CONSTRAINT fk7643c6bf26b9a8f7 FOREIGN KEY (programa_cod_programa)
REFERENCES programa (cod_programa) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (OIDS=FALSE);
ALTER TABLE servico OWNER TO postgres;
meu hibernate-cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/SEGIv1.0</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.connection.username">postgres</property>
<property name="hibernate.connection.password">postgres</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">180</property>
<property name="hibernate.c3p0.idle_test_period">100</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<mapping class="xxx.estrutura.Servico" />
<mapping class="xxx.estrutura.Programa" />
</session-factory>
</hibernate-configuration>
minhas classe programa e servico
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
@Entity
@Table(name = "programa")
public class Programa {
private static final long serialVersionUID = -5582648910303813488L;
@Id
@GeneratedValue
@Column(name = "cod_programa")
private Long cod_programa;
@Column(name = "nome")
private String nome;
@OneToMany(mappedBy = "programa", fetch = FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
private List<Servico> servicos = new ArrayList<Servico>();
public Long getCod_programa() {
return cod_programa;
}
public void setCod_programa(Long cod_programa) {
this.cod_programa = cod_programa;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public List<Servico> getServicos() {
return servicos;
}
public void setServicos(List<Servico> servicos) {
this.servicos = servicos;
}
public String toString() {
return this.nome;
}
@Override
public boolean equals(Object obj) {
if ((obj instanceof Programa)
&& (((Programa) obj).getNome().equals(this.nome))) {
return true;
} else {
return false;
}
}
public int hashCode() {
return this.nome.length() * 23;
}
}
classe servico
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name = "servico")
public class Servico {
private static final long serialVersionUID = -2094704997130038211L;
@Id
@GeneratedValue
@Column(name = "cod_servico")
private Long cod_servico;
@Column(name = "nome")
private String nome;
@ManyToOne(cascade = javax.persistence.CascadeType.ALL)
@JoinColumn(name = "programa_cod_programa")
private Programa programa;
public Long getCod_servico() {
return cod_servico;
}
public void setCod_servico(Long cod_servico) {
this.cod_servico = cod_servico;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String toString() {
return this.nome;
}
public void setPrograma(Programa programa) {
this.programa = programa;
}
public Programa getPrograma() {
return programa;
}
@Override
public boolean equals(Object obj) {
if ((obj instanceof Servico)
&& (((Servico) obj).getNome().equals(this.nome))) {
return true;
} else {
return false;
}
}
public int hashCode() {
return this.nome.length() * 23;
}
}
Minha classe Dao genérica
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Session;
public class Dao<T> {
private static Logger logger = Logger.getLogger(Dao.class);
private Class<T> persistentClass;
protected Session session;
public Dao(Session session, Class<T> persistentClass) {
this.session = session;
this.persistentClass = persistentClass;
}
@SuppressWarnings("unchecked")
public T load(Long id) {
logger.info("lendo " + persistentClass + " com id " + id);
return (T) session.load(persistentClass, id);
}
public void save(T t) {
logger.info("salvando " + t);
session.save(t);
}
public void delete(T t) {
logger.info("deletando " + t);
session.delete(t);
}
@SuppressWarnings("unchecked")
public List<T> list() {
logger.info("Listando todos");
return session.createCriteria(persistentClass).list();
}
public void merge(T t) {
logger.info("Salvando ou atualizando" + t);
session.merge(t);
}
}
minha ServicoDao
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import xxx.estrutura.Servico;
public class ServicoDao extends Dao<Servico> {
private Logger logger = Logger.getLogger(ServicoDao.class);
public ServicoDao(Session session, Class<?> classe) {
super(session, Servico.class);
}
public Servico pesquisaServicoById(Long cod_servico) {
logger.info("pesquisaUnidadeById : " + cod_servico);
return (Servico) session.load(Servico.class, cod_servico);
}
@SuppressWarnings("unchecked")
public List<Servico> pesquisaServicosNome(String nome) {
Criteria c = session.createCriteria(Servico.class);
c.add(Restrictions.ilike("nome", "%" + nome + "%"));
return c.list();
}
@SuppressWarnings("unchecked")
public List<Servico> getServicosId(Long id) { //metodo q me retorna o erro PSQLException
Criteria c = session.createCriteria(Servico.class);
List<Servico> results = c.createCriteria("programa").add(
Restrictions.like("cod_programa", id)).list();
return results;
}
@SuppressWarnings("unchecked")
public List<Servico> getServicosByPrograma(Long id) { //esse me retorna o mesmo erro...
Query q = session.createQuery("select c from "
+ Servico.class.getName()
+ " as c where c.programa.cod_programa like :id");
q.setParameter("cod_programa", id);
return q.list();
}
}
classe bean
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.el.ELContext;
import javax.el.ELResolver;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import javax.faces.validator.ValidatorException;
import org.hibernate.Session;
public class UnidadeHandler implements Serializable {
private static final long serialVersionUID = 626173424191015932L;
private Unidade unidade = new Unidade();
private Long id;
private ProgramaHandler programaSelecionado = new ProgramaHandler();
private ServicoHandler servicoSelecionado = new ServicoHandler();
private List<SelectItem> servicos = new ArrayList<SelectItem>();
private Programa programa = new Programa();
private Servico servico = new Servico();
public List<SelectItem> getProgramas() {
Session session = HibernateUtil.currentSession();
ProgramaDao dao = new ProgramaDao(session, Programa.class);
List<Programa> lista = dao.list();
List<SelectItem> itens = new ArrayList<SelectItem>(lista.size());
for (Programa p : lista) {
itens.add(new SelectItem(p.getCod_programa(), p.getNome()));
}
return itens;
}
public void actionCarregaServicos() {
this.setServicos(this.getServicosByPrograma());
}
public List<SelectItem> getServicosByPrograma() {
Session session = HibernateUtil.currentSession();
ServicoDao dao = new ServicoDao(session, Servico.class);
List<Servico> servicos = dao.getServicosId(this.programa
.getCod_programa());
List<SelectItem> items = new ArrayList<SelectItem>(servicos.size());
for (Servico c : servicos) {
items.add(new SelectItem(c.getCod_servico(), c.getNome()));
}
return items;
}
meu jsp
<h:outputLabel for="programa" value="Programa " />
<h:selectOneMenu id="programa" value="#{unidadeHandler.programa.cod_programa}">
<f:selectItem itemValue="" itemLabel="Selecione..." />
<f:selectItems value="#{unidadeHandler.programas}" />
<a4j:support event="onchange" ajaxSingle="true" action="#{unidadeHandler.actionCarregaServicos}" reRender="programa,servico"/>
</h:selectOneMenu>
<h:outputLabel for="servico" value="Servico " />
<h:selectOneMenu id="servico" value="#{unidadeHandler.servico.cod_servico}">
<f:selectItem itemValue="" itemLabel="Selecione..." />
<f:selectItems value="#{unidadeHandler.servicos}" />
</h:selectOneMenu>
hehehe:D de repente, assim fica mais fácil achar meu erro...