Muitos já devem ter se deparado com situações onde se faz necessário que apenas não mais que uma coluna da tabela seja trazida, o Hibernate oferece uma solução pra isso usando HQL. Para isso vamos usar a Classe Consulta como exemplo, ela tem um relacionamento com a Classe médico e desejamos trazer todos os horário com consultas ativas de um determinado médico em um determinado dia.


Crie a seguinte query HQL:


StringBuffer hql = new StringBuffer();

hql.append("SELECT hora FROM Consulta ");

hql.append("WHERE crm_medico=:crm ");

hql.append("AND status=:status ");

hql.append("AND data=:data ");


Nessa query fazemos a seleção apenas da coluna hora, que é o dado buscado, e mais abaixo declaramos os parâmetros.


Crie a query e a transação:


Transaction tx = session.beginTransaction();

Query query = session.createQuery(hql.toString());


Passe os parâmetros:


SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

query.setString("crm", crm);

query.setBoolean("status", true);

query.setString("data", sdf.format(data));


Note que usamos um SimpleDateFormat na data e passamos a mesma como string na nossa query.


Por fim faça o commit e passe a lista retornada para uma lista do tipo de dado buscado no nosso caso uma lista de Date.


tx.commit();

horarios=(List<Date>) query.list();



Imagine a seguinte situação: Precisamos relacionar duas tabelas, clínica e médico, sendo que nesse relacionamento eu desejo guardar a data que o médico foi vinculado aquela clínica. No nosso exemplo vamos partir do ponto que já tenhamos o médico e a clinica devidamente mapeados e registros de ambos inseridos no banco.


Crie uma classe como exemplo abaixo:


@SuppressWarnings("serial")

@Embeddable

public class Clinica_MedicoPK implements Serializable{

@ManyToOne (fetch = FetchType.EAGER )

@JoinColumn (name= "cnpj_clinica" )

@OnDelete(action = OnDeleteAction.CASCADE)

@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)

private Clinica clinica;

@ManyToOne (fetch = FetchType.EAGER )

@JoinColumn (name= "crm_medico" )

@OnDelete(action = OnDeleteAction.CASCADE)

@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)

private Medico medico;

@Temporal(TemporalType.DATE)

private Date data_cadastro;


Temos então uma instancia da classe Clinica e uma da classe Medico como também uma instancia da classe Date que irá guardar a data de cadastro. Se você já notou temos a anotação @Embeddable, que indica que essa classe funciona com uma chave composta para uma tabela. Feito isso crie outra classe como o exemplo abaixo:


@Entity

@Table (name= "clinica_medico")

public class Clinica_Medico implements Serializable{

@EmbeddedId

private Clinica_MedicoPK clinica_MedicoPK;


public Clinica_MedicoPK getClinica_MedicoPK() {

return clinica_MedicoPK;

}


public void setClinica_MedicoPK(Clinica_MedicoPK clinica_MedicoPK) {

this.clinica_MedicoPK = clinica_MedicoPK;

}


}

Essa será nossa tabela com uma instancia de Clinica_MedicoPK que será chave composta da tabela clinica_medico.


Abaixo temos uma exemplo de como inserir:


//a clinica e o médico já inseridos no banco

Clinica clinica = repositorio.buscarClinica(id_clinica);

Medico medico = repositorio.buscarMedico(id_medico);


Clinica_MedicoPK clMedicoPK = new Clinica_MedicoPK();

//seto a clinica no pk

clMedicoPK.setClinica(clinica);

//seto o médico

clMedicoPK.setMedico(medico);

//seto a data de cadastro

clMedicoPK.setData_cadastro(new Date(System.currentTimeMillis()));

//instacio a classe que vai conter o pk

Clinica_Medico clinica_Medico = new Clinica_Medico();

//adiciono a pk com a clinica e o médico

clinica_Medico.setClinica_MedicoPK(clMedicoPK);


//insiro no banco o vínculo da clinica com o medico

repositorio.salvarClinicaMedico(clinica_Medico);

Category

Category

  • (1)
  • (1)
  • (1)
  • (1)
  • (1)
  • (1)

Category

Category