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:
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);
}
}
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;
}
}
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
}
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
Seu problema está nesse código:
filtro.getIndicacoes()
Isso retorna um array
de string[] {"c1","C2"}
Enquanto deveria retornar uma lista de objetos Indicacao
Para ajustar deverá fazer umas das alternativas abaixo:
cast
e fazendo a restrição direto no campoAnswered by Marcelo Ferreira on November 30, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP