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