0

我想像这样使用带有 CONTAINS 的命名参数:

select p from person p
where CONTAINS(p.name , :myName)

String myName = "Bob Jones";
q.setString("myName", "*" + myName + "*");  

它不起作用,错误:

org.hibernate.exception.GenericJDBCException: could not execute query
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.loader.Loader.doList(Loader.java:2536)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
    at org.hibernate.loader.Loader.list(Loader.java:2271)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316)
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842)
    at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157)
Caused by: java.sql.SQLException: Erreur de syntaxe près de 'Jones*' dans la condition de recherche en texte intégral '*Bob Jones*'.
    at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)
    at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2820)
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2258)
    at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:632)
    at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:477)
    at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:778)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1953)
    at org.hibernate.loader.Loader.doQuery(Loader.java:802)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
    at org.hibernate.loader.Loader.doList(Loader.java:2533)
    ... 8 more

我用hibernate 3.6 应该怎么办?谢谢!

4

2 回答 2

1

我假设您使用的是 SQL Server。那么您的查询包含与 Hibernate 或 Java 无关的问题。这只是关于 CONTAINS 运算符的语法。只需使用任何可以直接查询数据库的工具尝试一下。

如果要查询两个单词,语法为以下之一:

select * from person where contains(name, 'Bob AND Jones');
select * from person where contains(name, 'Bob OR Jones');
select * from person where contains(name, '"Bob Jones"');

如果您还想查询前缀,它是:

select * from person where contains(name, 'Bob* AND Jones*');
select * from person where contains(name, 'Bob* OR Jones*');
select * from person where contains(name, '"Bob Jones*"');

您不能将星号放在单词或短语的前面。

我建议您查看CONTAINS 运算符的描述。

更新:

谢谢你的评论。如果您查看旧代码,您会注意到包含在 CONTAINS 的第二个参数中的额外双引号,类似于我的第三个也是最后一个示例。这就是您当前代码中缺少的内容。所以要修复它:

String myName = "Bob Jones";
q.setString("myName", "\"*" + myName + "*\"");
于 2012-12-31T22:54:44.367 回答
0

您可能想尝试使用 like 而不是 contains。

from Person p where p.name like :myName

然后当你执行查询

List<User> userList = query.setParameter("myName", "%" + name+ "%").list();
于 2012-12-31T21:43:56.343 回答