Seu la siguiente asignación

@Entity
public class User {

    private Integer id;

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

}

Aviso id es un número Entero. Ahora tengo esta consulta HQL utilizando como operador

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

ATT: ES como operador NO = (operador es igual)

Entonces yo uso

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

Pero no funciona porque Hibernate se queja IllegalArgumentException ocurrió llamar a captador de Usuario.id

Incluso cuando yo uso

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

No funciona

¿Qué debo usar para pasar a la consulta ?

¿Qué motor de base de datos está utilizando?
no se responder a tu pregunta (que parece que has descubierto por ti mismo de todos modos), pero acabo de preguntar – ¿por qué? Estoy realmente interesado – ¿qué caso de uso que requiere COMO comparación para lo que parece ser un sustituto de la clave?
Hola Chss. Se trata de un legado de sistema. Es la estructura de árbol, donde un grupo de padres de coincidencia de id de todos los niños de la id. Por ejemplo, si yo tengo un grupo id = 22100 y quiero recuperar a sus hijos, por la coincidencia de 221 prefijo, yo uso >>> como ‘221%’.
Lo que yo veo. Teniendo en cuenta que la columna subyacente es numérico (y, siendo un PK, es probable que el índice) es probable que obtenga un mejor rendimiento haciendo comparación numérica. E. g. para el ejemplo anterior, usted haría where userId > 22100 and userId < 22200. Dependiendo de su motor de base de datos y el tamaño de la tabla, la diferencia puede ser muy drástica (debido a que el índice se utiliza aquí, pero no se utiliza para COMO)
Gracias por su respuesta. Es una muy buena idea. En ese caso, yo creo que es necesario utilizar una expresión regular para recuperar su prefijo. Pero hay algunas limitaciones debido a que EN ALGUNOS CASOS necesito recuperar algunos niños, no todos. Así que la solución puede no funcionar como se espera.

OriginalEl autor Arthur Ronald | 2009-12-14

2 Comentarios

  1. 28

    De acuerdo a la referencia de Hibernate:

    str() se utiliza para convertir numéricos o valores temporales a una cadena legible

    Así que cuando yo uso

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

    Funciona bien

    Sí, sí que lo es. str() me dio la solución. Luché con el mismo problema, porque mi clase de entidad tiene campo LARGO. He utilizado Hibernate como operador y me dio elenco de excepción. La solución se encontró con Hiberanate str() método y he utilizado consultas de hibernate. Por favor, encontrar consulta de ejemplo. seleccione b.billNumber de Factura b, donde str(b.billNumber) como :billNumber»).setString(«billNumber,your_parameter).lista();
    gran solución. Encantador…

    OriginalEl autor Arthur Ronald

  2. 7

    Bien, COMO operador se utiliza generalmente con datos textuales, es decir, con VARCHAR o columnas CHAR, y usted tiene numérico id columna (ENTERO).

    Tal vez usted podría tratar de mapa id campo también como cadena y utilizar ese campo en la consulta. Esto puede o puede no funcionar dependiendo de su motor de base de datos. Tenga en cuenta que usted debe manejar todas las actualizaciones a través de setId() y considerar idAsString campo de solo lectura.

    @Entidad 
    public class Usuario { 
    
    private Integer id; 
    Cadena privada de idAsString; 
    
    @Id; 
    privada Entero getId() { 
    devolución de este.id; 
    } 
    
    private void setId(Integer id) { 
    este.id = id; 
    } 
    
    @Column(name="id", insertable=false, actualizable=false) 
    Cadena privada de getIdAsString() { 
    devolución de este.idAsString; 
    } 
    
    private void setIdAsString(Cadena idAsString) { 
    este.idAsString = idAsString; 
    } 
    } 
    

    A 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();

    OriginalEl autor Juha Syrjälä

Dejar respuesta

Please enter your comment!
Please enter your name here