Problema Criteria Hibernate com Group By = Múltiplos selects

0 respostas
danielisozaki

Boa tarde Comunidade.

Tenho a consulta abaixo que esta gerando um select a mais para cada paciente, quando o meu desejo é que fosse gerado um único utilizando JOIN.

@SuppressWarnings("unchecked")
public List<InfoQuantitativoImpressaoPaciente> buscarComFiltro(FiltroControleImpressao filtro) {
	Criteria criteria = criarCriteriaParaFiltro(filtro);
	criteria.setFetchMode("paciente", FetchMode.JOIN);
	
	ProjectionList pl = Projections.projectionList()
			.add(Projections.sqlGroupProjection("to_char(dataimpressao,'MM/yyyy') as periodoImpressao", "periodoImpressao",
					new String[] { "periodoImpressao" }, new Type[] { StandardBasicTypes.STRING }))
			.add(Projections.groupProperty("paciente").as("paciente"))
			.add(Projections.groupProperty("tipoRelatorio").as("tipoRelatorio"))
			.add(Projections.count("codigo").as("quantidade"));

	criteria.setProjection(pl).setResultTransformer(Transformers.aliasToBean(InfoQuantitativoImpressaoPaciente.class));

	return criteria.list(); ;
}

Abaixo o select de saída:

select
    to_char(dataimpressao,
    'MM/yyyy') as periodoImpressao,
    this_.prontuario as y1_,
    this_.tipo_relatorio as y2_,
    count(this_.codigo) as y3_ 
from
    apoiohu.seguranca_paciente_controle_impressao this_ 
group by
    periodoImpressao,
    this_.prontuario,
    this_.tipo_relatorio 

select
    paciente0_.prontuario as prontuar1_30_0_,
    paciente0_.bairro as bairro2_30_0_,
    paciente0_.cartao_saude as cartao_s3_30_0_,
    paciente0_.cep as cep4_30_0_,
    paciente0_.cidade as cidade5_30_0_,
    paciente0_.compl_logradouro as compl_lo6_30_0_,
    paciente0_.cor as cor7_30_0_,
    paciente0_.cpf as cpf8_30_0_,
    paciente0_.data_nascimento as data_nas9_30_0_,
    paciente0_.ddd_telefone as ddd_tel10_30_0_,
    paciente0_.estado as estado11_30_0_,
    paciente0_.idade as idade12_30_0_,
    paciente0_.logradouro as logrado13_30_0_,
    paciente0_.nome as nome14_30_0_,
    paciente0_.numero_logradouro as numero_15_30_0_,
    paciente0_.ocupacao as ocupaca16_30_0_,
    paciente0_.rg as rg17_30_0_,
    paciente0_.sexo as sexo18_30_0_,
    paciente0_.telefone as telefon19_30_0_ 
from
    apoiohu.remote_paciente paciente0_ 
where
    paciente0_.prontuario=?

Segue a entidade e a classe de retorno da consulta.

@Entity
@Table(schema = "apoiohu", name = "seguranca_paciente_controle_impressao")
public class ControleImpressao implements Serializable {

    private static final long serialVersionUID = 1L;

    public static final String SEQUENCE_NAME = "SEGURANCA_PACIENTE_CONTROLE_IMPRESSAO_SEQ";

    private Long codigo;
    private Date dataImpressao;
    private TipoRelatorio tipoRelatorio;
    private Paciente paciente;
    private String impressora;
    private String ip;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = SEQUENCE_NAME)
    @SequenceGenerator(schema = "apoiohu", name = ControleImpressao.SEQUENCE_NAME, sequenceName = ControleImpressao.SEQUENCE_NAME, allocationSize = 1)
    public Long getCodigo() {
    	return codigo;
    }

    public void setCodigo(Long codigo) {
	this.codigo = codigo;
    }

	    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "data_impressao")
    public Date getDataImpressao() {
	return dataImpressao;
    }

    public void setDataImpressao(Date dataImpressao) {
	this.dataImpressao = dataImpressao;
    }

    @Enumerated(EnumType.STRING)
    @Column(name = "tipo_relatorio")
    public TipoRelatorio getTipoRelatorio() {
	return tipoRelatorio;
    }

    public void setTipoRelatorio(TipoRelatorio tipoRelatorio) {
	this.tipoRelatorio = tipoRelatorio;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "prontuario")
    public Paciente getPaciente() {
	return paciente;
    }

    public void setPaciente(Paciente paciente) {
	this.paciente = paciente;
    }

    public String getImpressora() {
	return impressora;
    }

    public void setImpressora(String impressora) {
	this.impressora = impressora;
    }

    public String getIp() {
	return ip;
    }

    public void setIp(String ip) {
	this.ip = ip;
    

    @Override
    public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + ((codigo == null) ? 0 : codigo.hashCode());
	return result;
    }

    @Override
    public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	ControleImpressao other = (ControleImpressao) obj;
	if (codigo == null) {
		if (other.codigo != null)
			return false;
	} else if (!codigo.equals(other.codigo))
		return false;
	return true;
    }

}

public class InfoQuantitativoImpressaoPaciente implements Serializable {

    private static final long serialVersionUID = 1L;

    private String periodoImpressao;
    private Paciente paciente;
    private TipoRelatorio tipoRelatorio;
    private Long quantidade;

    public String getPeriodoImpressao() {
	return periodoImpressao;
    }

    public void setPeriodoImpressao(String periodoImpressao) {
	this.periodoImpressao = periodoImpressao;
    }

    public Paciente getPaciente() {
	return paciente;
    }

    public void setPaciente(Paciente paciente) {
	this.paciente = paciente;
    }

    public TipoRelatorio getTipoRelatorio() {
	return tipoRelatorio;
    }

    public void setTipoRelatorio(TipoRelatorio tipoRelatorio) {
	this.tipoRelatorio = tipoRelatorio;
    }

    public Long getQuantidade() {
	return quantidade;
    }

    public void setQuantidade(Long quantidade) {
	this.quantidade = quantidade;
    }

}

Abs

Criado 18 de março de 2016
Respostas 0
Participantes 1