Criteria to filter a string array list

0

I'm developing a Java Web application and came across a question. I have a relationship n: n between AgendaTriados and Indicacao thus forming the triados_indicacao. And when saved to the database, it saves a string array of the names of the indications. It turns out that now I want to do a search using criteria to return these indications that are linked to the agenda. I'm using a selectmanycheckbox to show the options.

Class ScheduleTriados

@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);

    }

}

Class Indication

@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 ScheduleTriadosFilter **

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;

//getts e setts
}

Repository Triates

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.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        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;
    }

}

I want to get this list of directions ... I try to search using

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

But the following error appears

  

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

    
asked by anonymous 05.03.2018 / 21:51

1 answer

0

Here's your problem

filtro.getIndicacoes()

This returns an array of string [] {"c1", "C2"} while the way it is done should return a list of Indicator objects.

Objects must have compatible types.

You should adjust this by creating an alias and doing the direct constraint in the field ... or change or return to list of objects

    
06.03.2018 / 23:37