2012-08-15 62 views
5

Tengo una consulta SQL de Hibernate como esto:¿Cómo hacer la consulta Hibernate usando like y%?

public void funcA(String str) { 
    StringBuilder sql = new StringBuilder(); 
    sql.append("select fieldA from tableA where fieldB like '%:searchKey%'"); 

    ... 

    session.createSQLQuery(sql.toString()) 
    .addScalar("fieldA", StandardBasicTypes.STRING) 
    .setParameter("searchKey", str); 

    ... 
} 

cuando hago una consulta como esta query.list(), Me siguiente error:

[WARNING ] SQL Error: -7, SQLState: 42601[ERROR ] The character "%" following "fieldB like" is not valid. 
[ERROR ] An error occurred during implicit system action type "2". Information returned for the error includes SQLCODE "-7", SQLSTATE "42601" and message tokens "%|fieldB like". 

se puede saber ¿Cómo podría solucionar este problema?

Respuesta

12

esto debería funcionar:

public void funcA(String str) { 
    StringBuilder sql = new StringBuilder(); 
    sql.append("select fieldA from tableA where fieldB like :searchKey"); 

    ... 

    session.createSQLQuery(sql.toString()) 
    .addScalar("fieldA", StandardBasicTypes.STRING) 
    .setParameter("searchKey", "%" + str + "%"); 

    ... 
} 
+0

¿qué ocurre si el campo A es largo o no tiene cadena? Entonces hibernate no le gusta la cadena. Todavía quiero hacer una coincidencia "difusa" (es decir, contiene el uso de %%) pero la columna es larga. Las consultas de Mysql están bien con esto, pero no parece que hibernate. –

3

Para nosotros esto funciona ...

whereCluase += " and lower(" + firstAttribute + ") like ?"; 
    queryParams.add("%" + value.toLowerCase() + "%"); 

Lo siento por la publicación de un pequeño fragmento. Pero esto debería ser suficiente para sacarte de problemas.

EDITAR: de comentario, lower y toLowerCase() es la implementación de casos y en la sensibilidad aquí.

+0

+1 Nota: todo e 'lower()'/'toLowerCase()' es solo un ejemplo de cómo hacer un case-insensitively. No es necesario en este caso. –

2

En el mismo ejemplo, he utilizado MatchMode (clase de hibernación, para hacer frente a las restricciones precedentes similares).

public void funcA(String str) { 
    StringBuilder sql = new StringBuilder(); 
    sql.append("select fieldA from tableA where fieldB like :searchKey"); 

    ... 
    session.createSQLQuery(sql.toString()) 
    .addScalar("fieldA", StandardBasicTypes.STRING) 
    .setParameter("searchKey", MatchMode.ANYWHERE.toMatchString(str)); 

    ... 
} 

MatchMode.ANYWHERE.toMatchString(str) : toMatchString method converts the value string to enum from which it is called.

Opciones:

  • en cualquier lugar: '%' + valor + '%'
  • END: '%' + valor
  • START: valor + '%'
  • EXACT: valor
Cuestiones relacionadas