Criteria to filter a string array list

Asked

Viewed 507 times

1

I have a relationship n:n amid AgendaTriados and Indicacao thus forming the triados_indicacao. Saved in the database a array of string of the names of the indications.

I want to do a survey using criteria to return these statements that are linked to the agenda. I am using a selectManyCheckBox to show options. Follow my code:

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

    }

}

Class 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;
    }
}

I want to search this list of directions using:

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

I’m getting the following error:

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

  • And what is the SQL generated by the criteria?

1 answer

0

Your problem is in that code:

filtro.getIndicacoes()
  • This returns a array of string[] {"c1","C2"}

  • While you should return a list of objects Indicacao

    • Objects need to be of compatible types

To adjust you should make one of the alternatives below:

  • Creating a cast and making the restriction directly in the field
  • Change return to object list

Browser other questions tagged

You are not signed in. Login or sign up in order to post.