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

SQLServerを使用していると思います。次に、クエリにHibernateまたはJavaとは関係のない問題が含まれています。これは、CONTAINS演算子の構文についてです。データベースを直接クエリできるツールで試してみてください。

2つの単語をクエリする場合、構文は次のいずれかになります。

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演算子の説明をご覧になることをお勧めします。

アップデート:

ご意見ありがとうございます。古いコードを見ると、私の3番目で最後の例と同様に、CONTAINSの2番目の引数を囲む二重引用符の余分なペアに気付くでしょう。それが現在のコードに欠けているものです。だからそれを修正するには:

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

containsの代わりにlikeを使用してみてください。

from Person p where p.name like :myName

次に、クエリを実行すると

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