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".
3 Réponses :
Pour nous, cela fonctionne ...
whereCluase += " and lower(" + firstAttribute + ") like ?";
queryParams.add("%" + value.toLowerCase() + "%");
+1 Notez que tous les inférieur () code> / tolowercase () code> est juste un exemple de fonctionnement de casse-insensitation. Ce n'est pas nécessaire dans ce cas.
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 + "%");
...
}
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?
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));
...
}