[Resolvido!] Como fazer uma criteria no modelo dessa query

olá pessoal, estou com um problema tentando usar esse método no meu Dao…

[code] @SuppressWarnings(“unchecked”)
public List getServicosByPrograma(Long id) {
Query q = session.createQuery("select p from “
+ Servico.class.getName()
+ " as p where p.programa.cod_programa like :id”);
q.setParameter(“id”, id);

	return q.list();
}[/code]

está me retornando esse erro:

[code]HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: javax.servlet.ServletException: #{unidadeHandler.actionCarregaServicos}: org.hibernate.exception.SQLGrammarException: could not execute query
br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:26)

root cause

javax.servlet.ServletException: #{unidadeHandler.actionCarregaServicos}: org.hibernate.exception.SQLGrammarException: could not execute query
javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:23)

root cause
root cause

org.postgresql.util.PSQLException: ERRO: operador não existe: bigint ~~ bigint
Dica: Nenhum operador corresponde com o nome e o(s) tipo(s) de argumento(s) informados. Você precisa adicionar conversões de tipo explícitas.
Posição: 174
org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062)
org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795)
org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479)
org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:367)
org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:271)
com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
org.hibernate.loader.Loader.doQuery(Loader.java:674)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
org.hibernate.loader.Loader.doList(Loader.java:2220)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
org.hibernate.loader.Loader.list(Loader.java:2099)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
br.gov.rr.setrabes.dao.ServicoDao.getServicosByPrograma(ServicoDao.java:52)
br.gov.rr.setrabes.handler.UnidadeHandler.getServicosByPrograma(UnidadeHandler.java:79)
br.gov.rr.setrabes.handler.UnidadeHandler.actionCarregaServicos(UnidadeHandler.java:71)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:616)
org.apache.el.parser.AstValue.invoke(AstValue.java:131)
org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
com.sun.faces.application.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
javax.faces.component.UICommand.broadcast(UICommand.java:383)
org.ajax4jsf.component.AjaxActionComponent.broadcast(AjaxActionComponent.java:61)
org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:186)
org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:164)
org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:352)
com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:23)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.14 logs.
Apache Tomcat/6.0.14[/code]

Alguém poderia me dizer qual o erro ou me dizer como posso fazer isso usando criteria??

Valeu!!!

Algo assim:

public List<Servico> getServicosByPrograma(Long id) { Criteria criteria = session.createCriteria(Servico.class); List<Servico> results = criteria.createCriteria("programa").add(Restrictions.like("cod_programa",id)).list(); return results; }

[quote=marcelo.bellissimo]Algo assim:

public List<Servico> getServicosByPrograma(Long id) { Criteria criteria = session.createCriteria(Servico.class); List<Servico> results = criteria.createCriteria("programa").add(Restrictions.like("cod_programa",id)).list(); return results; }[/quote]

Marcelão, meu amigo, valeu pela ajuda…

Mas me deu a mesma Exception…
:frowning:
Eu estou usando o banco em Postgresql, será que tem algum conflito entre algun @xxx da minha classe com o hibernate ou postgresql??

segue a classe:

[code]import java.io.Serializable;
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.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;

@Entity
@Table(name = “programas”)
public class Programa implements Serializable {

private static final long serialVersionUID = -5582648910303813488L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "PROGRAMA_ID")
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;
}

}[/code]

Valeu!!!

Cara, é algum erro de conversão de tipo do PostGre… tenta mudar o tipo do seu atributo cod_programa de Long pra BigInteger … e também do parametro sendo passado pra ele na consulta …

Marcelão, tentei alterar para BigInteger, mas ele dá problema de incompatibilidade …

o q mais eu posso tentar fazer?

Eu vou tentar simular aqui, mas faça um teste enquanto isso:
Sua variável é Long? use o Query.setLong()… se for BigInteger, use Query.setBigInteger()… sacou? Cada tipo tem o seu “setter” específico no objeto Query, que realiza as conversões necessárias… talvez isso solucione o problema… e verifique como que o campo está criado na tabela, se é bigint ou numeric (não me recordo os tipos do Postgre, pra falar a verdade… :? ), e use uma variável adequada para esse tipo…

Blz, eu mandei gerar as tabelas por um gerador de tabelas, que ficaram assim:

[code] create table programas (
PROGRAMA_ID bigserial not null,
nome varchar(255),
primary key (PROGRAMA_ID)
)
09:21:58,777 DEBUG SchemaExport:303 -
create table programas (
PROGRAMA_ID bigserial not null,
nome varchar(255),
primary key (PROGRAMA_ID)
)

create table servicos (
    SERVICO_ID  bigserial not null,
    nome varchar(255),
    id_servico_programa int8,
    primary key (SERVICO_ID)
)

09:21:58,823 DEBUG SchemaExport:303 -
create table servicos (
SERVICO_ID bigserial not null,
nome varchar(255),
id_servico_programa int8,
primary key (SERVICO_ID)
)

alter table servicos 
    add constraint FK523511948EECFB92 
    foreign key (id_servico_programa) 
    references programas

09:21:58,885 DEBUG SchemaExport:303 -
alter table servicos
add constraint FK523511948EECFB92
foreign key (id_servico_programa)
references programas

[/code]

fiz uma correçao no sql, e agora naum é mais bigserial, e sim int8. O problema é q continua dando o mesmo erro…

Tá me aparecendo o erro na linha 41 do meu ServicoDao, que está assim:

@SuppressWarnings("unchecked") public List<Servico> getServicosId(Long id) { Criteria c = session.createCriteria(Servico.class); List<Servico> results = c.createCriteria("programa").add( Restrictions.like("cod_programa", id)).list(); //essa é a linha do erro... return results; }

erro:

[code]javax.servlet.ServletException: javax.servlet.ServletException: #{unidadeHandler.actionCarregaServicos}: org.hibernate.exception.SQLGrammarException: could not execute query
br.gov.rr.setrabes.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:26)

org.postgresql.util.PSQLException: ERRO: operador não existe: bigint ~~ bigint
Dica: Nenhum operador corresponde com o nome e o(s) tipo(s) de argumento(s) informados. Você precisa adicionar conversões de tipo explícitas.
Posição: 317

br.gov.rr.setrabes.dao.ServicoDao.getServicosId(ServicoDao.java:41)

[/code]

o banco está assim:

[code]-- 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;
[/code]

Alguem poderia me ajudar?

Manda a sua classe Servico também. Vou tentar simular isso aqui, tá muito estranho.

Fala Kleber

Ao invéz de usar LIKE, use EQ(“cod_programa”, id). Vê aí se funciona :slight_smile:

[quote=Leozin]Fala Kleber

Ao invéz de usar LIKE, use EQ(“cod_programa”, id). Vê aí se funciona :)[/quote]

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… :?

[quote=marcelo.bellissimo][quote=Leozin]Fala Kleber

Ao invéz de usar LIKE, use EQ(“cod_programa”, id). Vê aí se funciona :)[/quote]

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… :? [/quote]

Poisé marcelo… num sei q p#@#$ é essa…

Vamos do começo… minhas tabelas:

[code]-- 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;
[/code]

meu hibernate-cfg.xml

[code]<?xml version="1.0" encoding="UTF-8"?>

jdbc:postgresql://localhost:5432/SEGIv1.0 org.postgresql.Driver org.hibernate.dialect.PostgreSQLDialect postgres postgres 5 20 180 100 org.hibernate.cache.EhCacheProvider
	<property name="hibernate.show_sql">true</property>
	<property name="hibernate.format_sql">true</property>


    <mapping class="xxx.estrutura.Servico" />
    <mapping class="xxx.estrutura.Programa" />
[/code]

minhas classe programa e servico

[code]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;
}

}[/code]

classe servico

[code]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;
}

}[/code]

Minha classe Dao genérica

[code]import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Session;

public class Dao {

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);
}

}[/code]

minha ServicoDao

[code]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 {

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();
}

}[/code]

classe bean

[code]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;
}

[/code]

meu jsp

[code]
<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>			
	[/code]

hehehe:D de repente, assim fica mais fácil achar meu erro…

não deu certo a tentativa? :frowning:

Tente trocar o mlike pelo EQ igual ja falaram…

eu nao gosto muito do postgres por causa desses erros de conversão, que sempre deixam a gente louco…

BLZ Leozin, meu amigo. DEU CERTO!! Era realmente esse o problema!!
Eu vou dar uma estudada em criteria pra naum apanhar mais feio assim!!

PROBLEMA RESOLVIDO!!! :stuck_out_tongue_winking_eye:
GLÓRIA AO SENHOR JESUS!!!
OBRIGADO A TODOS!

glória senhor, glória!!!

[quote=luciene.silva]Tente trocar o mlike pelo EQ igual ja falaram…

eu nao gosto muito do postgres por causa desses erros de conversão, que sempre deixam a gente louco…[/quote]

É verdade luciene, eu não tenho quase nenhum conhecimento sobre sql, mas pelo q já andei apanhando, realmente postgresql tem muita dificuldade de conversão… mas infelizmente esse sistema é recomendado pelo Governo Federal a se usar o banco em postgre… fazer oq… :frowning:

Valeu.