我有一个像这样的Hibernate SQL查询:
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);
...
}
当我像query.list()
这样进行查询时,出现了以下错误:
[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 :(得分:12)
这应该有效:
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 + "%");
...
}
答案 1 :(得分:3)
对我们来说这是有效的......
whereCluase += " and lower(" + firstAttribute + ") like ?";
queryParams.add("%" + value.toLowerCase() + "%");
很抱歉发布了一个小片段。但这应该足以让你摆脱困境。
编辑:来自评论,lower
和toLowerCase()
是为了在此处实施案例敏感性。
答案 2 :(得分:3)
在同一个例子中,我使用了MatchMode(hibernate类,来处理谓词限制)。
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方法将值字符串转换为从中调用它的枚举。
选项: