I ask for your help to help me with a query I'm doing and return me an error. I have tried it with createNativeQuery
and with createQuery
, but it is generating error; the idea is that it receives a parameter and that it can do the search in the columns, this is the query that I am executing:
Query query = em.createNativeQuery(“ SELECT p” + “ FROM Profesor p” +
“ WHERE lower(p.nombre) like :nombre” +
“ OR lower(p.apellido) like :apellido” +
“ OR lower(p.genero) like :genero” +
“ OR lower(p.estadoCivil) like :estado” +
“ OR lower(p.emailPersonal) like :emailp” +
“ OR lower(p.emailInstitucional) like :emaili” +
“ OR lower(p.direccion) like :direccion”)
.setParameter(“nombre”, “%”+ param.toUpperCase() + “%”)
.setParameter(“apellido”, “%”+ param.toUpperCase() + “%”)
.setParameter(“genero”, “%”+ param.toUpperCase() + “%”)
.setParameter(“estado”, “%”+ param.toUpperCase() + “%”)
.setParameter(“emailp”, “%”+ param.toUpperCase() + “%”)
.setParameter(“emaili”, “%”+ param.toUpperCase() + “%”)
.setParameter(“direccion”, “%”+ param.toUpperCase() + “%”);
and with:
Query query = em.createQuery("SELECT p FROM Profesor p WHERE " +
"UPPER(p.nombre) like :parametro");
query.setParameter("parametro", "%"+ param.toUpperCase() + "%")
.setParameter("parametro", "%"+ param.toUpperCase() + "%");
The error that GlassFish generates is:
javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: syntax error at or near “:”
Position: 57
Error Code: 0
Call: SELECT p FROM Profesor p WHERE lower(p.nombre) like :nombre OR lower(p.apellido) like :apellido OR lower(p.genero) like :genero OR lower(p.estadoCivil) like :estado OR lower(p.emailPersonal) like :emailp OR lower(p.emailInstitucional) like :emaili OR lower(p.direccion) like :direccion
Query: DataReadQuery(sql=” SELECT p FROM Profesor p WHERE lower(p.nombre) like :nombre OR lower(p.apellido) like :apellido OR lower(p.genero) like :genero OR lower(p.estadoCivil) like :estado OR lower(p.emailPersonal) like :emailp OR lower(p.emailInstitucional) like :emaili OR lower(p.direccion) like :direccion”)
Error generated
javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: ERROR: syntax error at or near ":"
Position: 57
Error Code: 0
Call: SELECT p FROM Profesor p WHERE lower(p.nombre) like :nombre OR lower(p.apellido) like :apellido OR lower(p.genero) like :genero OR lower(p.estadoCivil) like :estado OR lower(p.emailPersonal) like :emailp OR lower(p.emailInstitucional) like :emaili OR lower(p.direccion) like :direccion
Query: DataReadQuery(sql=" SELECT p FROM Profesor p WHERE lower(p.nombre) like :nombre OR lower(p.apellido) like :apellido OR lower(p.genero) like :genero OR lower(p.estadoCivil) like :estado OR lower(p.emailPersonal) like :emailp)
Teacher Class
@Entity
@Table(name = "profesor")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Profesor.findAll", query = "SELECT p FROM Profesor p"),
@NamedQuery(name = "Profesor.findById", query = "SELECT p FROM Profesor p WHERE p.id = :id"),
@NamedQuery(name = "Profesor.findByIdProfesor", query = "SELECT p FROM Profesor p WHERE p.idProfesor = :idProfesor"),
@NamedQuery(name = "Profesor.findByTipoDocumento", query = "SELECT p FROM Profesor p WHERE p.tipoDocumento = :tipoDocumento"),
@NamedQuery(name = "Profesor.findByNumeroDocumento", query = "SELECT p FROM Profesor p WHERE p.numeroDocumento = :numeroDocumento"),
@NamedQuery(name = "Profesor.findByNombre", query = "SELECT p FROM Profesor p WHERE p.nombre = :nombre"),
@NamedQuery(name = "Profesor.findByApellido", query = "SELECT p FROM Profesor p WHERE p.apellido = :apellido"),
@NamedQuery(name = "Profesor.findByFechaDeExpedicion", query = "SELECT p FROM Profesor p WHERE p.fechaDeExpedicion = :fechaDeExpedicion"),
@NamedQuery(name = "Profesor.findByLugarDeExpedicion", query = "SELECT p FROM Profesor p WHERE p.lugarDeExpedicion = :lugarDeExpedicion"),
@NamedQuery(name = "Profesor.findByRh", query = "SELECT p FROM Profesor p WHERE p.rh = :rh"),
@NamedQuery(name = "Profesor.findByIdPaisNacionalidad", query = "SELECT p FROM Profesor p WHERE p.idPaisNacionalidad = :idPaisNacionalidad"),
@NamedQuery(name = "Profesor.findByGenero", query = "SELECT p FROM Profesor p WHERE p.genero = :genero"),
@NamedQuery(name = "Profesor.findByIdPaisLugarNacimiento", query = "SELECT p FROM Profesor p WHERE p.idPaisLugarNacimiento = :idPaisLugarNacimiento"),
@NamedQuery(name = "Profesor.findByFechaDeNacimiento", query = "SELECT p FROM Profesor p WHERE p.fechaDeNacimiento = :fechaDeNacimiento"),
@NamedQuery(name = "Profesor.findByIdPaisDeOrigen", query = "SELECT p FROM Profesor p WHERE p.idPaisDeOrigen = :idPaisDeOrigen"),
@NamedQuery(name = "Profesor.findByEstadoCivil", query = "SELECT p FROM Profesor p WHERE p.estadoCivil = :estadoCivil"),
@NamedQuery(name = "Profesor.findByIdDepartamento", query = "SELECT p FROM Profesor p WHERE p.idDepartamento = :idDepartamento"),
@NamedQuery(name = "Profesor.findByEmailPersonal", query = "SELECT p FROM Profesor p WHERE p.emailPersonal = :emailPersonal"),
@NamedQuery(name = "Profesor.findByEmailInstitucional", query = "SELECT p FROM Profesor p WHERE p.emailInstitucional = :emailInstitucional"),
@NamedQuery(name = "Profesor.findByTelefonoFijo", query = "SELECT p FROM Profesor p WHERE p.telefonoFijo = :telefonoFijo"),
@NamedQuery(name = "Profesor.findByCelular", query = "SELECT p FROM Profesor p WHERE p.celular = :celular"),
@NamedQuery(name = "Profesor.findByDireccion", query = "SELECT p FROM Profesor p WHERE p.direccion = :direccion"),
@NamedQuery(name = "Profesor.findByParams", query = " SELECT p" +
" FROM Profesor p" +
" WHERE lower(p.nombre) like :parametro" +
" OR lower(p.apellido) like :parametro" +
" OR lower(p.genero) like :parametro" +
" OR lower(p.estadoCivil) like :parametro" +
" OR lower(p.emailPersonal) like :parametro" +
" OR lower(p.emailInstitucional) like :parametro" +
" OR lower(p.direccion) like :parametro" )})
public class Profesor implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@NotNull
@Column(name = "id_profesor")
private int idProfesor;
@Size(max = 2147483647)
@Column(name = "tipo_documento")
private String tipoDocumento;
@Basic(optional = false)
@NotNull
@Column(name = "numero_documento")
private BigInteger numeroDocumento;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 2147483647)
@Column(name = "nombre")
private String nombre;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 2147483647)
@Column(name = "apellido")
private String apellido;
@Column(name = "fecha_de_expedicion")
@Temporal(TemporalType.DATE)
private Date fechaDeExpedicion;
@Size(max = 2147483647)
@Column(name = "lugar_de_expedicion")
private String lugarDeExpedicion;
@Size(max = 2147483647)
@Column(name = "rh")
private String rh;
@Column(name = "id_pais_nacionalidad")
private Integer idPaisNacionalidad;
@Size(max = 2147483647)
@Column(name = "genero")
private String genero;
@Column(name = "id_pais_lugar_nacimiento")
private Integer idPaisLugarNacimiento;
@Column(name = "fecha_de_nacimiento")
@Temporal(TemporalType.DATE)
private Date fechaDeNacimiento;
@Column(name = "id_pais_de_origen")
private Integer idPaisDeOrigen;
@Size(max = 2147483647)
@Column(name = "estado_civil")
private String estadoCivil;
@Column(name = "id_departamento")
private Integer idDepartamento;
@Size(max = 2147483647)
@Column(name = "email_personal")
private String emailPersonal;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 2147483647)
@Column(name = "email_institucional")
private String emailInstitucional;
@Size(max = 2147483647)
@Column(name = "telefono_fijo")
private String telefonoFijo;
@Column(name = "celular")
private BigInteger celular;
@Size(max = 2147483647)
@Column(name = "direccion")
private String direccion;
public Profesor() {
}
public Profesor(Integer id) {
this.id = id;
}
public Profesor(Integer id, int idProfesor, BigInteger numeroDocumento, String nombre, String apellido, String emailInstitucional) {
this.id = id;
this.idProfesor = idProfesor;
this.numeroDocumento = numeroDocumento;
this.nombre = nombre;
this.apellido = apellido;
this.emailInstitucional = emailInstitucional;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public int getIdProfesor() {
return idProfesor;
}
public void setIdProfesor(int idProfesor) {
this.idProfesor = idProfesor;
}
public String getTipoDocumento() {
return tipoDocumento;
}
public void setTipoDocumento(String tipoDocumento) {
this.tipoDocumento = tipoDocumento;
}
public BigInteger getNumeroDocumento() {
return numeroDocumento;
}
public void setNumeroDocumento(BigInteger numeroDocumento) {
this.numeroDocumento = numeroDocumento;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellido() {
return apellido;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
public Date getFechaDeExpedicion() {
return fechaDeExpedicion;
}
public void setFechaDeExpedicion(Date fechaDeExpedicion) {
this.fechaDeExpedicion = fechaDeExpedicion;
}
public String getLugarDeExpedicion() {
return lugarDeExpedicion;
}
public void setLugarDeExpedicion(String lugarDeExpedicion) {
this.lugarDeExpedicion = lugarDeExpedicion;
}
public String getRh() {
return rh;
}
public void setRh(String rh) {
this.rh = rh;
}
public Integer getIdPaisNacionalidad() {
return idPaisNacionalidad;
}
public void setIdPaisNacionalidad(Integer idPaisNacionalidad) {
this.idPaisNacionalidad = idPaisNacionalidad;
}
public String getGenero() {
return genero;
}
public void setGenero(String genero) {
this.genero = genero;
}
public Integer getIdPaisLugarNacimiento() {
return idPaisLugarNacimiento;
}
public void setIdPaisLugarNacimiento(Integer idPaisLugarNacimiento) {
this.idPaisLugarNacimiento = idPaisLugarNacimiento;
}
public Date getFechaDeNacimiento() {
return fechaDeNacimiento;
}
public void setFechaDeNacimiento(Date fechaDeNacimiento) {
this.fechaDeNacimiento = fechaDeNacimiento;
}
public Integer getIdPaisDeOrigen() {
return idPaisDeOrigen;
}
public void setIdPaisDeOrigen(Integer idPaisDeOrigen) {
this.idPaisDeOrigen = idPaisDeOrigen;
}
public String getEstadoCivil() {
return estadoCivil;
}
public void setEstadoCivil(String estadoCivil) {
this.estadoCivil = estadoCivil;
}
public Integer getIdDepartamento() {
return idDepartamento;
}
public void setIdDepartamento(Integer idDepartamento) {
this.idDepartamento = idDepartamento;
}
public String getEmailPersonal() {
return emailPersonal;
}
public void setEmailPersonal(String emailPersonal) {
this.emailPersonal = emailPersonal;
}
public String getEmailInstitucional() {
return emailInstitucional;
}
public void setEmailInstitucional(String emailInstitucional) {
this.emailInstitucional = emailInstitucional;
}
public String getTelefonoFijo() {
return telefonoFijo;
}
public void setTelefonoFijo(String telefonoFijo) {
this.telefonoFijo = telefonoFijo;
}
public BigInteger getCelular() {
return celular;
}
public void setCelular(BigInteger celular) {
this.celular = celular;
}
public String getDireccion() {
return direccion;
}
public void setDireccion(String direccion) {
this.direccion = direccion;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Profesor)) {
return false;
}
Profesor other = (Profesor) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "edu.poli.prap.gd.data.Profesor[ id=" + id + " ]";
}
}
Sorry it would be something like this:
Query query = em.createQuery(" SELECT p" +
" FROM Profesor p" +
" WHERE UPPER(p.nombre) like ?nombre" +
" OR UPPER(p.apellido) like ?apellido" +
" OR UPPER(p.genero) like ?genero" +
" OR UPPER(p.estadoCivil) like ?estadoCivil" +
" OR UPPER(p.emailPersonal) like ?emailPersonal" +
" OR UPPER(p.emailInstitucional) like ?emailInstitucional" +
" OR UPPER(p.direccion) like ?direccion")
query.setParameter(nombre, “%”+ param.toUpperCase() + “%”)
.setParameter(apellido, “%”+ param.toUpperCase() + “%”)
.setParameter(genero, “%”+ param.toUpperCase() + “%”)
.setParameter(estadoCivil, “%”+ param.toUpperCase() + “%”)
.setParameter(emailPersonal, “%”+ param.toUpperCase() + “%”)
.setParameter(emailInstitucional, “%”+ param.toUpperCase() + “%”)
.setParameter(direccion, “%”+ param.toUpperCase() + “%”);
New Consultation
Query query = em.createQuery("SELECT p FROM Profesor p WHERE " +
"UPPER(p.nombre) like ?1" +
"UPPER(p.genero) like ?2");
query.setParameter(1, "%"+ param.toUpperCase() + "%").setParameter(2, "%"+ param.toUpperCase() + "%");
New Error:
java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager:
Exception Description: Syntax error parsing [SELECT p FROM Profesor p WHERE UPPER(p.nombre) like ?1UPPER(p.genero) like ?2].
[52, 59] The positional input parameter ''{0}'' cannot use non-Integer characters.
[70, 77] The expression is invalid, which means it does not follow the JPQL grammar.