2009-12-14 21 views
13

Seu el siguiente mapeoHibernate HQL consulta utilizando como operador

@Entity 
public class User { 

    private Integer id; 

    @Id; 
    private Integer getId() { 
     return this.id; 
    } 

} 

Aviso id es un entero. Ahora necesito esta consulta HQL utilizando como operador

Query query = sessionFactory.getCurrentSession().createQuery("from User u where u.id like :userId"); 

ATT: ES como operador NOT = (operador de igualdad)

Luego uso

List<User> userList = query.setParameter("userId", userId + "%").list(); 

pero no lo hace trabajo porque Hibernate se queja IllegalArgumentException que se produjo llamando getter de User.id

Incluso cuando se utiliza

query.setString("userId", userId + "%"); 

no funciona

¿Qué debo usar para pasar la consulta?

+0

Qué motor de base de datos que está utilizando? –

+0

@Arthur - no responde su pregunta (parece que lo ha descubierto por su cuenta de todos modos) pero solo tengo que preguntar: ¿por qué? Estoy genuinamente interesado, ¿qué caso de uso tienes que requiera una comparación LIKE para lo que parece ser una clave sustituta? – ChssPly76

+0

@ ChssPly76 - Hola Chss. Es un sistema heredado. Es una estructura de árbol donde una id del grupo padre coincide con la id de todos los niños. Por ejemplo, si tengo un ID de grupo = 22100 y quiero recuperar su hijo, al hacer coincidir el prefijo 221, uso >>> como '221%'. –

Respuesta

25

Según Hibernate referencia:

str() se utiliza para la conversión de los valores numéricos o temporales en una cadena legible

Entonces cuando uso

from User u where str(u.id) like :userId 

Funciona bien

+0

Sí lo es. str() me dio la solución. Tuve problemas con el mismo problema porque mi clase de entidad tiene el campo LARGO. Usé Hibernate como operador y me dio excepción de cast. Solución encontrada con el método Hiberanate str() y utilicé consultas de hibernación. Por favor encuentre una consulta de muestra. seleccione b.billNumber de Bill b donde str (b.billNumber) like: billNumber "). setString (" billNumber, your_parameter) .list(); –

+0

gran solución. Encantador... – bynu022

7

Bueno, el operador LIKE se usa generalmente con datos textuales, es decir, con columnas VARCHAR o CHAR, y tiene la columna numérica id (INTEGER).

Quizás podría intentar asignar el campo id también como una cadena y usar ese campo en la consulta. Esto puede o no funcionar dependiendo de su motor de base de datos. Tenga en cuenta que debe manejar todas las actualizaciones a través del setId() y considerar que el campo idAsString es de solo lectura.

 
@Entity 
public class User { 

    private Integer id; 
    private String idAsString; 

    @Id; 
    private Integer getId() { 
     return this.id; 
    } 

    private void setId(Integer id) { 
     this.id = id; 
    } 

    @Column(name="id", insertable=false, updatable=false) 
    private String getIdAsString() { 
     return this.idAsString; 
    } 

    private void setIdAsString(String idAsString) { 
     this.idAsString = idAsString; 
    } 
} 

continuación, la consulta sería:

Query query = sessionFactory.getCurrentSession().createQuery("from User u where u.idAsString like :userId"); 
List<User> userList = query.setParameter("userId", userId + "%").list(); 
Cuestiones relacionadas