如何使用CONTAINS命名参数

时间:2012-12-31 21:37:00

标签: java hibernate

我想使用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 我该怎么办? 谢谢!

2 个答案:

答案 0 :(得分: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 operator的说明。

<强>更新

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

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

答案 1 :(得分:0)

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

from Person p where p.name like :myName

然后执行查询

List<User> userList = query.setParameter("myName", "%" + name+ "%").list();