Dúvidas Hibernate

Pessoal, to começando agora com Hibernate e tenho algumas dúvidas:

1 - Quando preciso declarar um atributo para busca ou de return string descricao de uma chave estrangeira, por exemplo:

@Entity
public class Entidade{
  @Id
  private Long id;
  private String nome;
  private Integer ativo; //existe um campo na tabela com este nome
  private String ativo_string; //NÃO existe campo na tabela com este nome, só para retornar SIM p/ ativo = 1 ou NÂO p/ ativo = 0
  private String busca;//Para filtrar um List

  //--Get and Set--
}

Se eu fizer isso dá erro informando que não existe colunas na tabela do banco de dados com os nome ativo_string e busca. Como devo proceder nestes casos ?

2 - Como preencher uma List utilizando o hibernate com um select descrito abaixo ? (Select usado com prepareStatement):

sql = cnct.conn.prepareStatement
      ("  SELECT distinct t.* " +
       "    FROM( "+
       "        SELECT w.id_workflow, "+ 
       "   	       w.descricao,  "+
       "		       w.quantidade_aprovacoes, "+ 
       "			 NVL(w.criterio_inicio,' ')criterio_inicio, "+ 
       "			 Decode(w.modo_notificacao,1,'Por Evento','Agrupado'), "+ 
       "			 w.tempo_limite || ' minutos', "+ 
       "			 w.id_tabela_base, "+ 
       "			 w.id_grupo_workflow,  "+
       "			 gw.descricao grupo, "+ 
       "			 tb.descricao tabela, " +
       "         	 Decode(w.prioridade,null,' ',w.prioridade)prioridade "+  
       "        FROM wf_workflow w, "+ 
       "	 		 wf_grupo_workflow gw, "+ 
       "			 wf_tabela_base tb, "+ 
       "			 wf_workflow_item wi "+ 
       "	   WHERE w.id_grupo_workflow = ? "+ 
       "  		 AND w.id_workflow       = wi.id_workflow "+ 
       " 		 AND w.id_grupo_workflow = gw.id_grupo_workflow "+ 
       "		 AND w.id_tabela_base 	 = tb.id_tabela_base "+ 
       "		 AND wi.username         = Upper(?) "+ 
			       
" UNION ALL "+
				       
       "	  SELECT w.id_workflow, "+ 
       "			 w.descricao,  "+
       "			 w.quantidade_aprovacoes, "+ 
       "			 NVL(w.criterio_inicio,' ')criterio_inicio, "+ 
       "			 Decode(w.modo_notificacao,1,'Por Evento','Agrupado'), "+ 
       "			 w.tempo_limite || ' minutos', "+ 
       "			 w.id_tabela_base, "+ 
       "			 w.id_grupo_workflow,  "+
       "			 gw.descricao grupo, "+ 
       "			 tb.descricao tabela, " +
       "         	 Decode(w.prioridade,null,' ',w.prioridade)prioridade "+  
       " 		FROM wf_workflow w, "+ 
       " 		 	 wf_grupo_workflow gw, "+ 
       "		 	 wf_tabela_base tb "+
       "	   WHERE w.id_grupo_workflow = ? "+ 
       " 		 AND w.id_grupo_workflow = gw.id_grupo_workflow "+ 
       "		 AND w.id_tabela_base 	 = tb.id_tabela_base "+ 
       "		 AND Not Exists (Select 1 From wf_workflow_item i "+ 
       "               			  Where i.id_workflow = w.id_workflow) "+  
       "	 )t "+  
       "ORDER BY t.prioridade, " +
       "         t.id_workflow");
sql.setString(1, id_grupo_workflow);
sql.setString(2, filtro_workflow);
sql.setString(3, id_grupo_workflow);

Vejo duas formas de fazer isso, com @Transient ou com @Enumerated. O segundo caso funciona com Hibernate + JPA.

@Transient
private String ativo_string;
@Transient
private String busca;
public enum SimNao {
SIM, NAO
}

 @Entity
 public class Entidade{
   @Id
   private Long id;
   private String nome;
   @Enumerated(EnumType.ORDINAL)
   private Integer ativo; //0=Sim e 1=Não
}

Cara usa Enum como o nosso amigo ensinos é muito mais prático e elegante e para resolver o problema da query esquece ter q escrever sql como esta usando o hibernate usa hql é muito prático um exemplo:

Query q = em.createQuery("from Objeto o where=:argumento1 and argumento2 and argumento3");
q.setParameter("argumento1",argumento1);
q.setParameter("argumento2",argumento2);
q.setParameter("argumento3",argumento3);

onde Objeto é o objeto raiz de sua consulta com suas coleções, as outras consultas o hibernate faz para vc.

veja se ajuda senão posta ai q agente tenta ajudar mais

[quote=heitor.rapcinski]Vejo duas formas de fazer isso, com @Transient ou com @Enumerated. O segundo caso funciona com Hibernate + JPA.

public enum SimNao {
SIM, NAO
}

 @Entity
 public class Entidade{
   @Id
   private Long id;
   private String nome;
   @Enumerated(EnumType.ORDINAL)
   private Integer ativo; //0=Sim e 1=Não
}

[/quote]

Fiz dessa forma, mas continua listando como 0 e 1, ao invés de SIM e NÃO, tem algum passo a mais que devo fazer ?? Ah, duas dúvida em relação a isto, qual é a definição de Enumerated ?? e quando vou recuperar no meu formulário tem que retornar 0 e 1 mesmo no value do campo, como é tratado isso ?

Valew.

E quando meu argumento é um resultado de select, por exemplo:

WHERE Not Exists (Select 1 From wf_workflow_item i  
                           Where i.id_workflow = w.id_workflow)

OU

AND (Select campo From tabela Where id = ?) = 1

Como posso fazer isso utilizando hibernate ?

Valew.

pq vc não passa essa string pra boolean?

[quote=marceloplis][quote=robson_vs]

Query q = em.createQuery("from Objeto o where=:argumento1 and argumento2 and argumento3");
q.setParameter("argumento1",argumento1);
q.setParameter("argumento2",argumento2);
q.setParameter("argumento3",argumento3);

[/quote]

E quando meu argumento é um resultado de select, por exemplo:

WHERE Not Exists (Select 1 From wf_workflow_item i  
                           Where i.id_workflow = w.id_workflow)

OU

AND (Select campo From tabela Where id = ?) = 1

Como posso fazer isso utilizando hibernate ?

Valew.[/quote]

Cara lembre q vc esta usando jpa e com jpa vc trabalha orientado a objetos inclusive nas suas queris onde cada tabela no seu banco acabará sendo um objeto estou passando um link de uma material da caelum q deve ajudar dá uma lida só para vc entender melhor e qualquer coisa posta ai denovo vc vai ver q depois q entender legal como funciona nunca mais vai querer escrever novamente jdbc http://www.caelum.com.br/caelum/apostila/caelum-java-web-fj28.pdf

[quote=robson_vs][quote=marceloplis][quote=robson_vs]

Query q = em.createQuery("from Objeto o where=:argumento1 and argumento2 and argumento3");
q.setParameter("argumento1",argumento1);
q.setParameter("argumento2",argumento2);
q.setParameter("argumento3",argumento3);

[/quote]

E quando meu argumento é um resultado de select, por exemplo:

WHERE Not Exists (Select 1 From wf_workflow_item i  
                           Where i.id_workflow = w.id_workflow)

OU

AND (Select campo From tabela Where id = ?) = 1

Como posso fazer isso utilizando hibernate ?

Valew.[/quote]

Cara lembre q vc esta usando jpa e com jpa vc trabalha orientado a objetos inclusive nas suas queris onde cada tabela no seu banco acabará sendo um objeto estou passando um link de uma material da caelum q deve ajudar dá uma lida só para vc entender melhor e qualquer coisa posta ai denovo vc vai ver q depois q entender legal como funciona nunca mais vai querer escrever novamente jdbc http://www.caelum.com.br/caelum/apostila/caelum-java-web-fj28.pdf[/quote]

Robson, é justamente por esta apostila que me iniciei no uso do hibernate, o problema é que lá não tem nada…nenhum exemplo que esclareça este caso na condição where que comentei.

Valew.

Ok então vamos fazer o seguinte vou tentar ajudar a vc com um exemplo ñ é nada grande coisa mais só para ver se consigo ajudar

tenho a classe Pessoa q se referencia a uma tabela no banco pessoas esta classe faz referencias a outras tabelas exemplo telefonesrepresentada pela classe Telefone:

Classe Pessoa

package br.com.nosbor.agenda.modelo;

import java.io.Serializable;
import java.util.Date;
import java.util.Set;

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.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "pessoas")
public class Pessoa implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;

	@Column(name = "nome", nullable = false, length = 50)
	private String nome;

	@Temporal(TemporalType.DATE)
	@Column(name = "data_nacimento", nullable = true)
	private Date dataNacimento;

	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "pessoa_id")
	private Set<Email> email;

	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "pessoa_id")
	private Set<Telefone> fone;

	public Date getDataNacimento() {
		return dataNacimento;
	}

	public void setDataNacimento(Date dataNacimento) {
		this.dataNacimento = dataNacimento;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Set<Email> getEmail() {
		return email;
	}

	public void setEmail(Set<Email> email) {
		this.email = email;
	}

	public Set<Telefone> getFone() {
		return fone;
	}

	public void setFone(Set<Telefone> fone) {
		this.fone = fone;
	}
}

Classe Telefone

package br.com.nosbor.agenda.modelo;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import br.com.nosbor.agenda.enuns.TelefoneType;

@Entity
@Table(name = "telefones")
public class Telefone implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Integer id;

	@Column(name = "ddi", nullable = false, length = 3)
	private Integer ddi;

	@Column(name = "ddd", nullable = false, length = 2)
	private Integer ddd;

	@Column(name = "numero", nullable = false, length = 8)
	private Integer numero;

	@Column(name = "ramal", nullable = true, length = 15)
	private String ramal;

	@Enumerated(EnumType.ORDINAL)
	// @Column(name="tipo_telefone",nullable=false)
	private TelefoneType tipo;

	public Integer getDdd() {
		return ddd;
	}

	public void setDdd(Integer ddd) {
		this.ddd = ddd;
	}

	public Integer getDdi() {
		return ddi;
	}

	public void setDdi(Integer ddi) {
		this.ddi = ddi;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Integer getNumero() {
		return numero;
	}

	public void setNumero(Integer numero) {
		this.numero = numero;
	}

	public String getRamal() {
		return ramal;
	}

	public void setRamal(String ramal) {
		this.ramal = ramal;
	}

	public TelefoneType getTipo() {
		return tipo;
	}

	public void setTipo(TelefoneType tipo) {
		this.tipo = tipo;
	}
}

aproveitando o gancho vai o exemplo de enum

package br.com.nosbor.agenda.enuns;

public enum TelefoneType {

	CEL("Celular"), 
	COM("Comercial"), 
	FAX("Fax"), 
	REC("Recado"), 
	RES("Residencial");

	private String fone;

	private TelefoneType(String fone) {
		this.fone = fone;
	}

	public String getFone() {
		return fone;
	}
}

para listar a pessoa com o telefone ao inves do id de telefone vc faria um select semelhante ao q vc fez acima correto? tipo um select da pessoa e outro do telefone ou faria um select referenciando as duas tabelas correto

mais aqui faremos utilizando a orientação a objetos veja

package br.com.nosbor.agenda.test;

import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import br.com.nosbor.agenda.enuns.TelefoneType;
import br.com.nosbor.agenda.modelo.Email;
import br.com.nosbor.agenda.modelo.Pessoa;
import br.com.nosbor.agenda.modelo.Telefone;

public class PessoaTest {

	public static void main(String[] args) {

		EntityManagerFactory emf = Persistence
				.createEntityManagerFactory("AgendaPU");
		EntityManager em = emf.createEntityManager();

		incluir(em);
		listar(em);

		em.close();
		emf.close();

	}

	private static void incluir(EntityManager em) {

		String mensagem = null;

		try {
			Email e = new Email();
			e.setEmail("robson_vs@yahoo.com.br");

			Set<Email> mail = new HashSet<Email>();
			mail.add(e);

			Telefone t = new Telefone();
			t.setDdi(55);
			t.setDdd(11);
			t.setNumero(81286883);
			t.setTipo(TelefoneType.CEL);

			Set<Telefone> fone = new HashSet<Telefone>();
			fone.add(t);

			Pessoa p = new Pessoa();
			p.setNome("Robson Vieira da Silva");
			p.setDataNacimento(new Date(1976/18/12));
			p.setEmail(mail);
			p.setFone(fone);

			em.getTransaction().begin();
			em.persist(p);
			em.persist(t);
			em.persist(e);
			em.getTransaction().commit();

			mensagem = "Foi incluido o(a) '"
					+ em.find(Pessoa.class, p.getId().toString())
					+ "' com sucesso.";
		} catch (Exception e) {

			em.getTransaction().rollback();
			mensagem = "Erro ao tentar incluir registro no banco.";
			e.printStackTrace();
		}

		System.out.println(mensagem);
	}

	private static void listar(EntityManager em) {
		Query q = em.createQuery("select p from Pessoa p");
		List list = q.getResultList();
		Iterator it = list.iterator();

		while (it.hasNext()) {
			Pessoa p = (Pessoa) it.next();
			System.out.println("Nome: " + p.getNome() + " - Idade: "
					+ p.getDataNacimento());
			for (Email e : p.getEmail()) {
				System.out.println("Email: " + e.getEmail());
			}
			for (Telefone t : p.getFone()) {
				System.out.println("Telefone: " + t.getDdi() + " (" + t.getDdd() + ") "
						+ t.getNumero() + " r: " + t.getRamal() + " tipo "
						+ t.getTipo());
			}
		}
	}
}

observe que o unico select q tem é “select p from Pessoa p” e telefone é um objeto dentro de pessoa o hibernate faz os selects necessários e te entrega a lista com os dados da pessoa e o do telefone.

veja se o exemplo q estou te passando ajuda qualquer coisa posta ai