TransWikia.com

Criteria para filtrar uma lista de array de string

Stack Overflow em Português Asked by G. J on November 30, 2021

Tenho um relacionamento n:n entre AgendaTriados e Indicacao formando assim o triados_indicacao. Salva no banco de dados um array de string dos nomes das indicacoes.

Quero fazer uma pesquisa usando criteria para retornar essas indicações que estão ligadas a agenda. Estou usando um selectManyCheckBox para mostrar as opções. Segue meu código:

Classe AgendaTriados

@Entity
@Table(name = "agenda_triados")
public class AgendaTriados implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;
    private String observacao;
    private Date dataAtendimento;
    private Aluno aluno;
    private Aluno aluno2;
    private Disciplina disciplina;
    private AgendaMarcacao agenda_marcacao;
    private List<Indicacao> indicacoes = new ArrayList<>();

    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }

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

    @Column(columnDefinition = "text")
    public String getObservacao() {
        return observacao;
    }

    public void setObservacao(String observacao) {
        this.observacao = observacao;
    }

    @NotNull
    @Column(name = "data_atendimento")
    @Temporal(TemporalType.DATE)
    public Date getDataAtendimento() {
        return dataAtendimento;
    }

    public void setDataAtendimento(Date dataAtendimento) {
        this.dataAtendimento = dataAtendimento;
    }

    @NotNull
    @ManyToOne
    @JoinColumn(name = "id_aluno")
    public Aluno getAluno() {
        return aluno;
    }

    public void setAluno(Aluno aluno) {
        this.aluno = aluno;
    }

    @NotNull
    @ManyToOne
    @JoinColumn(name = "id_aluno2")
    public Aluno getAluno2() {
        return aluno2;
    }

    public void setAluno2(Aluno aluno2) {
        this.aluno2 = aluno2;
    }

    @NotNull
    @ManyToOne
    @JoinColumn(name = "id_disciplina")
    public Disciplina getDisciplina() {
        return disciplina;
    }

    public void setDisciplina(Disciplina disciplina) {
        this.disciplina = disciplina;
    }


    @NotNull
    @ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinColumn(name = "id_agenda_marcacao")
    public AgendaMarcacao getAgenda_marcacao() {
        return agenda_marcacao;
    }

    public void setAgenda_marcacao(AgendaMarcacao agenda_marcacao) {
        this.agenda_marcacao = agenda_marcacao;
    }

    @NotNull
    @ManyToMany
    @JoinTable(name = "triado_indicacao", 
               joinColumns = @JoinColumn(name = "agenda_triados_id"),
        inverseJoinColumns = @JoinColumn(name = "indicacao_id"))
    public List<Indicacao> getIndicacoes() {
        return indicacoes;
    }

    public void setIndicacoes(List<Indicacao> indicacoes) {
        this.indicacoes = indicacoes;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.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;
        AgendaTriados other = (AgendaTriados) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

    public void completarCampo() {
        Disciplina disciplina = new Disciplina();
        AgendaTriados triado = new AgendaTriados();

        triado.setDisciplina(disciplina);

    }

}

Classe Indicacao

@Entity
@Table(name = "indicacao")
public class Indicacao implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;
    private String nome;

    @Id
    @GeneratedValue
    public Long getId() {
        return id;
    }

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

    @Column(nullable = false)
    public String getNome() {
        return nome;
    }

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

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.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;
        Indicacao other = (Indicacao) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return nome;
    }
}

Repository AgendaTriadosFilter

public class AgendaTriadosFilter implements Serializable {
    private static final long serialVersionUID = 1L;
    private Date dataAtenderDe;
    private Date dataAtenderAte;
    private String nomeDisc;
    private String[] indicacoes;
    private String nomeAl;
    private String nomePaciente;
    private String codigo;
    private Turno[] turnos;
    private Pratica[] praticas;
    private int primeiroRegistro;
    private int quantidadeRegistros;
    //getters e setters
}

Repository Triados

public class Triados implements Serializable {

    private static final long serialVersionUID = 1L;

    @Inject
    private EntityManager manager;

    public AgendaTriados guardar(AgendaTriados triado) {
        return manager.merge(triado);
    }

    @Transactional
    public void remover(AgendaTriados triado) {
        try {
            triado = porId(triado.getId());
            manager.remove(triado);
            manager.flush();
        } catch (PersistenceException e) {
            throw new NegocioException("A agenda não pode ser excluída.");
        }
    }

    public AgendaTriados porId(Long id) {
        return manager.find(AgendaTriados.class, id);
    }


    @SuppressWarnings("unchecked")
    public List<AgendaTriados> filtrados(AgendaTriadosFilter filtro) {
        Criteria criteria = criarCriteriaParaFiltro(filtro);
        criteria.setFirstResult(filtro.getPrimeiroRegistro());
        criteria.setMaxResults(filtro.getQuantidadeRegistros());
        return criteria.addOrder(Order.asc("dataAtendimento")).list();
    }

    public int quantidadeFiltrados(AgendaTriadosFilter filtro) {
        Criteria criteria = criarCriteriaParaFiltro(filtro);
        criteria.setProjection(Projections.rowCount());
        return ((Number) criteria.uniqueResult()).intValue();
    }

    private Criteria criarCriteriaParaFiltro(AgendaTriadosFilter filtro) {
        Session session = this.manager.unwrap(Session.class);
        Criteria criteria = session.createCriteria(AgendaTriados.class, "tr");
        criteria.createAlias("tr.agenda_marcacao", "trag");
        criteria.createAlias("trag.lista_espera", "agenda");
        criteria.createAlias("agenda.paciente", "triado");
        criteria.createAlias("tr.disciplina", "trd");
        criteria.createAlias("tr.aluno", "tral");

        if (filtro.getDataAtenderDe() != null) {
            criteria.add(Restrictions.ge("tr.dataAtendimento", 
              filtro.getDataAtenderDe()));
        }
        if (filtro.getDataAtenderAte() != null) {
            criteria.add(Restrictions.le("tr.dataAtendimento", 
              filtro.getDataAtenderAte()));
        }
        if (StringUtils.isNotBlank(filtro.getNomeDisc())) {
            criteria.add(Restrictions.ilike("trd.nome", 
              filtro.getNomeDisc(), MatchMode.ANYWHERE));
        }
        if (StringUtils.isNotBlank(filtro.getCodigo())) {
            criteria.add(Restrictions.ilike("trd.codigo", 
              filtro.getCodigo(), MatchMode.EXACT));
        }
        if (filtro.getPraticas() != null && filtro.getPraticas().length > 0) {
            criteria.add(Restrictions.in("trd.pratica", filtro.getPraticas()));

        }
        if (filtro.getTurnos() != null && filtro.getTurnos().length > 0) {
            criteria.add(Restrictions.in("trd.turno", filtro.getTurnos()));

        }
        if (StringUtils.isNotBlank(filtro.getNomeAl())) {

            criteria.add(Restrictions.ilike("tral.nomeAluno", 
              filtro.getNomeAl(), MatchMode.ANYWHERE));
        }
        if (StringUtils.isNotBlank(filtro.getNomePaciente())) {

            criteria.add(Restrictions.ilike("triado.nome", 
              filtro.getNomePaciente(), MatchMode.ANYWHERE));
        }
        if (filtro.getIndicacoes() != null && filtro.getIndicacoes().length > 0) {
            criteria.add(Restrictions.in("tr.indicacoes", filtro.getIndicacoes()));
        }
        return criteria;
    }
}

Quero buscar essa lista de indicações usando:

if (filtro.getIndicacoes() != null && filtro.getIndicacoes().length > 0) {
    criteria.add(Restrictions.in("tr.indicacoes", filtro.getIndicacoes()));
}

Estou recebendo o seguinte erro:

Caused by: java.sql.SQLException: No value specified for parameter 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996) at
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935) at
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:924) at
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:870) at
com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2281)
at
com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2261)
at
com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2191)
at
com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2004)
at
org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:56)
… 104 more

One Answer

Seu problema está nesse código:

filtro.getIndicacoes()
  • Isso retorna um array de string[] {"c1","C2"}

  • Enquanto deveria retornar uma lista de objetos Indicacao

    • Os objetos precisam ser de tipos compatíveis

Para ajustar deverá fazer umas das alternativas abaixo:

  • Criando um cast e fazendo a restrição direto no campo
  • Mudar retorno para lista de objetos

Answered by Marcelo Ferreira on November 30, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP