Cómo hacer de consulta de Hibernate utilizando como y %?

Tengo una Hibernate SQL de la consulta como esta:

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(), tengo de error siguientes:

[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".

Puedo saber ¿cómo puedo resolver este problema?

OriginalEl autor huahsin68 | 2012-08-15

3 respuestas

  1. 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 + "%");
    
      ...
    }
    lo que si fieldA es Largo o de cadena no? Luego de hibernación no le gusta la cadena. Todavía quiero hacer un “fuzzy” de partido (es decir. contiene usar%%), pero la columna es Larga. Las consultas de Mysql están bien con esto, pero no parece que hibernar.

    OriginalEl autor Denis Zevakhin

  2. 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 un apuro.

    EDITAR: de comentario, lower y toLowerCase() es implementar caso-en la sensibilidad de aquí.

    +1 tenga en cuenta todos los lower()/toLowerCase() es sólo un ejemplo de cómo hacer coincidir mayúsculas-minúsculas. No es necesario en este caso.

    OriginalEl autor SiB

  3. 2

    En el mismo ejemplo, yo he usado MatchMode (clase de hibernación, para lidiar con el predicado like restricciones).

     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.En cualquier LUGAR.toMatchString(str) : toMatchString método convierte la cadena de valor de la enumeración que se llama.

    Opciones:

    • En cualquier LUGAR: ‘%’ + valor + ‘%’
    • FINAL: ‘%’ + valor
    • INICIO: valor + ‘%’
    • EXACTO: valor

    OriginalEl autor Gurpreet Singh

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *