Tenho o seguinte codigo que uso no mu projeto e ele esta funcionando
public void filtrar() {
Estado es = new Estado();
Session sessao = CriadorDeSessaoNovo.getSession();
Criteria listagem_query = sessao.createCriteria(Estado.class)
.addOrder(Order.asc("est_nom"));
setSuaLista(listagem_query.list());
sessao.close();
}
porém na linha em que passo o “Estado.class”, segundo o javadoc do hibernate eu tbm posso passar uma String, porém estou tentando mas ele nao consegue localizar a minha classe Estado(nela tem os atributos do banco de dados)
se passo uma String ele sempre da erro de unknow entity(entidade desconhecida)
quero fazer isso pra tentar criar um codigo mais reaproveitavel, tipo
public void filtrar(String modelo) {
Estado es = new Estado();
Session sessao = CriadorDeSessaoNovo.getSession();
Criteria listagem_query = sessao.createCriteria(modelo)
.addOrder(Order.asc("est_nom"));
setSuaLista(listagem_query.list());
sessao.close();
}
alguem sabe como usar o createCriteria, pois mesmo olhando no javadoc ele nao explica como fazer o mapeamento utilizando String
"eu suspeito que utilizar String é para passar a entidade atraves do XML"
OU tbm serviria pra mim se fosse possivel passar a classe como se fosse um atributo
eu ja tentei passar a classe como um Atributo Object, mas nao funcionou
Opa, blza, eu não tenho certeza, mas o caso de passar String, eu uso quando faço isso, da uma olhada no código mais ou menos.
Criteria crit = HibernateFactory.getSession().createCriteria(ConhecimentoTransporte.class);
Criteria crit2 = crit.createCriteria("notasFiscais");
crit2.add(Restrictions.eq("numeroNota", Integer.parseInt(numNf)));
ou seja, eu crio uma criteria de ConhecimentoTransporte, em seguida uma nova criteria no atributo notasFiscais que está dentro de ConhecimentoTransporte, assim eu pesquiso na lista que faz parte da classe.
Não sei se deu pra pegar bem, nunca usei de outra forma, uso pra fazer assim rsss…
Também tem a opção de passar direto, mais ou menos assim
Criteria crit = HibernateFactory.getSession().createCriteria(ConhecimentoTransporte.class,"notasFiscais");
mas dessa forma nunca usei, não sei se funciona.
Por que não passa um Class por parâmetro para o método, ao invés de passar String?
public void filtrar(Class clazz) {
Criteria listagem_query = sessao.createCriteria(clazz)
.addOrder(Order.asc("est_nom"));
}
Nunca usei o createCriteria que recebe String, mas imagino que você tenha que passar o nome completo da classe, com pacote e tudo. Foi assim que testou?
Jovem,
Poste o mapeamento da sua classe Estado.
Abs,
Não dava para passar por Class porque eu uso essa função para recuperar o valor(aprendi hj a usar ela, nao sei usar direito ainda) e ela não deixa eu capturar o parametro do f:param como Class, mesmo usando Cast
String classe = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get( "parametro" );
e passava assim na pagina HTML
<a4j:commandButton value="Pesquisar" render="out" action="#{listaEstado.pesquisar}" >
<f:param name="parametro" value="Estado" />
</a4j:commandButton>
mas so agora que percebi, nao estava passando o caminho completo da classe no createCriteria quando usava String, por isso nao funcionou, agora passei como String o caminho completo “br.com.salesianos.modelo.Estado” em vez de somente “Estado” e funcionou,
mas nao sei como posso usar a função com parametro como vc postou, no exemplo o “Class clazz” nao consigo passar algo pela xhtml para q ele receba
public void filtrar(Class clazz){
Criteria listagem_query = sessao.createCriteria(clazz)
.addOrder(Order.asc("est_nom"));
}
ou seja, todos os minhas funções que uso no JSF nao utilizam parametros, como faço para receber o valor como parametro igual vc colocou nao função
ps: meu mapeamento no hibernate é feito com anotações
@Entity
public class Estado implements Serializable
{
@Id
@SequenceGenerator(name="generator_estado",sequenceName="sequence_estado")
@GeneratedValue(generator="generator_estado")
private Integer est_id;
@Column(length=100)
private String est_nom;
@Column(length=2)
private String est_sigla;
//setters e getters
Jovem,
O seu mapeamento está errado você precisa informar o nome da tabela e das colunas.
@Entity
@Table(name = "Estado") // tem que informar o nome da tabela o nome fisico
public class Estado implements Serializable
{
@Id
@SequenceGenerator(name="generator_estado",sequenceName="sequence_estado")
@GeneratedValue(generator="generator_estado")
private Integer est_id;
@Column(name = "Est_nome"length=100) // informar o nome da coluna
private String est_nom;
@Column(name = "sigla"length=2) // informa o nome da coluna
private String est_sigla;
//setters e getters
acesse este link : http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/
abs,
É meu ManagedBean ListaEstado, que chama ele a partir do construtor
@ManagedBean
public class ListaEstado {
private String est_nom;
private List suaLista;
private List suaListaPesquisa;
public ListaEstado() {
filtrar();
}
public void filtrar() {
Session sessao = CriadorDeSessaoNovo.getSession();
Criteria listagem_query = sessao.createCriteria("br.salesianos.modelo.Estado")
.addOrder(Order.asc("est_nom"));
setSuaLista(listagem_query.list());
sessao.close();
}
public void pesquisar() throws ClassNotFoundException {
String classe = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get( "parametro" );
//System.out.println("é AKI: "+s);
//Class c = Class.forName(classe);
Session sessao = CriadorDeSessaoNovo.getSession();
Criteria listagem_query = sessao.createCriteria(classe)
.addOrder(Order.asc("est_nom"))
.add(Restrictions.like("est_nom","%"+getEst_nom()+"%")
.ignoreCase());
setSuaListaPesquisa(listagem_query.list());
sessao.close();
}
Ué, se a classe é específica de Estado (ListaEstado), por que precisa passar essa informação no HTML?
Se chegou nesse filtrar(), é obviamente um Estado, não? Passa Estado.class mesmo no createCriteria.
Kanin_Dragon, é opcional escrever o nome da coluna se for igual ao atributo. O mesmo para a tabela.
Com relação ao mapeamento acho q nao esta errado, no caso se omitir o nome da tabela, ele usa o nome da propria classe e o mesmo vale para as colunas na hora de criar o banco de dados, acho q estaria errado se eu estivesse usando XML, mas no caso de annotations funciona normalmente, pelo menos funciona aqui, nao sei se é uma boa pratica o que estou fazendo, mas funciona
agora q coloquei o caminho completo da minha classe Estado no meu metodo filtrar que usa o createCriteria do hibernate, ta funcionando tudo beleza
so queria aprender como utilizar melhor o f:param, pq apesar do codigo funcionar, parece q to fazendo uma gambiarra
A galera aqui do GUJ conhece muito mesmo…
Vlw gente
Pq to querendo criar um unico managedBean q faça o filtro para todas as minhas classes
Eu não conheço muito JSF, mas essa sua ideia (um único MB) me parece meio estranha. E não sei se daria pra fazer.
Você poderia concatenar o pacote ao nome da classe (que foi passado), mas como saberia qual o campo do order by, por exemplo?