2016-11-15 11 views
7

私はSQL Serverデータベースのテーブルを照会するJava Swingアプリケーションを開発中です。このテーブルには、アラビア語、中国語などにあるいくつかのデータが含まれています...しかし、問題は、このクエリを使用している間、私は何も結果を取得しておりませんということである:(varはアラビア語や他の言語とすることができる):HQLを使用してJavaアプリケーションからアラビア語を含むSQL Serverテーブルを照会できません

from Table T where T.columnName like '%"+var+"%' 

私はいくつかの検索を行なったし、その後、次のことを試してみました:

from Table T where T.columnName like N'%"+var+"%' 

私は、NetBeans上でこのエラーメッセージを取得しています:

例外スレッドで "AWT-EventQueueの-0"

org.hibernate.hql.internal.ast.QuerySyntaxException:予期しないトークン:Nニアライン1

誰かがこの問題で私を助けることができますか?私はこの同じ最後のクエリがSQL Server Management Studioで完全に機能していることを知っています。

答えて

4

を問題はHQL = T-SQLということで、次の2つを混合しています。 HQLは擬似SQLであるため、Unicode文字列のT-SQL固有のダイアレクト処理(文字列リテラル上のN -prefix)を理解できません。

session.createQuery("from Table T " + 
        "where T.column like :fltr ") 
     .setParameter("fltr", "%" + content + "%", StringNVarcharType.INSTANCE) 
     .list(); 
  • T-SQL

    を:

    1. HQL

      次のようにcreateQueryを使用して続行:あなたは2つのオプションがありますように

      だから、そうです次のようにcreateSQLQueryを使用する

      スイッチ:

      session.createSQLQuery("select * from Table T where T.column like N'%" + 
               content + "%' ").list(); 
      

      ありかもしれないここで行うために多くをすることが、私はそれをテストする方法がありません。 Hibernate ORM 5.2.4.Final User Guide

    さらに詳しい情報および例はで見つけることができ

  • +1

    こんにちは!私はあなたの最初のソリューションをテストし、それは魅力的なように機能しました!ありがとうございます...ちょっとした質問ですが、複数のパラメータがある場合、どのようにsetParametersを進めることができますか? – TheLila

    +0

    @ TheLila私は、 'session.createQuery(...)のような' setParameter'呼び出しを連鎖させることができますねsetParameter(...).... list(); ' –

    +0

    @ TheLilaはい、TTとして。任意の数のパラメータ(および他の関数/メソッド)をチェーンすることができるはずです。あなたのオプションの完全な説明については、リンクされたHibernateのドキュメントを参照してください。 –

    0

    はNVARCHARのように、あなたのVARを宣言し、見積書を削除します。

    FROM Table T WHERE T.columnName LIKE N'%' + var + N'%' 
    
    0

    は以下のHQLを使用します!

    String hql = "FROM Table T WHERE T.columnName LIKE CONCAT('%', :columnValue, '%')"; 
    session.createQuery(hql) 
         .setString("columnValue", "Sample Value") 
         .list(); 
    
    +0

    こんにちはジョバンに。あなたは 'NVARCHAR'カラムのアラビア語のテキストを明示的にテストしましたか?私はOPが質問を断念したかもしれないし、HQLに精通していないので、私はこれを本当にテストすることができないので、これを頼んでいます。私はOPの考えが彼の質問に答えた答えに恩恵を与えることを計画していたので、私は尋ねている。 –

    +0

    まあ、私はそれをテストしませんでした。しかし、それは動作するはずです。 – Jobin

    +0

    @TT。 Jobin:私はこれがうまくいくとは思わないでしょう。これは、O.P.が元々持っていたクエリ、すなわち、正しいパラメータ値がVARCHARリテラルで囲まれた(すなわち、「N」プレフィックスがない)ことを効果的に生成すべきである。トリックは、Hibernateにパラメータデータ型が 'NVARCHAR'であることを伝えることです。 –

    関連する問題