8
votes

Comment faire de la requête hibernée en utilisant comme et%?

J'ai une requête Hibernate SQL comme ceci:

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


0 commentaires

3 Réponses :


3
votes

Pour nous, cela fonctionne ...

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


1 commentaires

+1 Notez que tous les inférieur () / tolowercase () est juste un exemple de fonctionnement de casse-insensitation. Ce n'est pas nécessaire dans ce cas.



17
votes

Cela devrait fonctionner:

    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 + "%");

  ...
}


2 commentaires

Et si le champ est une longue ou non-string? Ensuite, Hibernate n'aime pas la chaîne. Je veux toujours faire une correspondance "floue" (c.-à-d. Contient en utilisant %%) mais la colonne est longue. Les requêtes MySQL sont correctes avec cela, mais cela ne semble pas que Hibernate soit.


Le code ci-dessus ne fonctionne pas pour moi. Toute autre alternative?



4
votes

Dans le même exemple, j'ai utilisé MATCHMODE (classe d'hibernate, traiter avec des restrictions de prédicat).

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

  ...
}


0 commentaires