22

基準ビルダーで ignorecase を実行するにはどうすればよいですか? 私が持っている場合

private final CriteriaBuilder cb

次に、cb.ascまたはのみを使用できますcb.descが、大文字と小文字を無視することはできません。

4

1 に答える 1

56

基準ビルダーで ignorecase を実行するにはどうすればよいですか

1. JPA プログラムで Ignorecase を強制する - ジョブを実行し、Q に直接回答する

  • 引数が 1 つの操作 (つまり、ORDER BY) の場合、引数を小文字 (または大文字) に変換します。
  • 引数が 2 つの演算 (=、LIKE、ORDER BY など) の場合は、両方の引数を LC (または UC) に変換します。

JPA ORDER BY 2 つの列、大文字と小文字を区別しない:

 Order lcSurnameOrder = criteriaBuilder.order(
     criteriaBuilder.lower(Person_.surname));
 Order lcFirstnameOrder = criteriaBuilder.order(
     criteriaBuilder.lower(Person_.firstname));    
 criteriaQuery.orderBy(lcSurnameOrder, lcFirstnameOrder);

JPA LIKE、大文字と小文字を区別しない:

 Predicate lcSurnameLikeSearchPattern = criteriaBuilder.like(
     criteriaBuilder.lower(Person_.surname), 
     searchPattern.toLowerCase());
 criteriaQuery.where(lcSurnameLikeSearchPattern);

Person_ canonical メタモデル クラスが Person エンティティから生成され、JPA 基準 API を厳密に型指定して使用できると仮定します。

ヒント: 最高のパフォーマンスと制御を得るには、データベースに INSERT/UPDATE を実行するときに、文字列列を LOWER ケースまたは INITCAP ケースに一度だけ変換することを検討してください。ユーザーが入力した検索パターンに対して同じ変換を行います。

2. 代替手段: データベースに照合を適用する - ベスト プラクティス、よりシンプル、より高性能

  • SQL-99 標準には、規則に従って文字列内の文字を比較するための組み込み修飾子があります。

    COLLATE <collation name>
    

    文字列の比較、並べ替え、およびグループ化に使用できます。大文字と小文字を区別しない一般的な例:

    COLLATE SQL_Latin1_General_CP1_CI_AS
    

    または

    COLLATE latin1_general_cs
    

    独自のカスタム照合を作成することもできます:

    CREATE COLLATION <collation name> FOR <character set specification>
      FROM <existing collation name> [ <pad characteristic> ]
    
  • 照合は、次のいずれかの代替方法 (ローカライズされたものからグローバルな効果まで) を介して DB に適用されます。

    • WHERE 句 (=、LIKE、HAVING、>、>= など)

      WHERE <expression> = <expression> [COLLATE <collation name>]
      
      WHERE <expression> LIKE <expression> [COLLATE <collation name>]
      
    • SELECT DISTINCT 句

      SELECT DISTINCT <expression> [COLLATE <collation name>], ...
      
    • ORDER BY 句

      ORDER BY <expression> [COLLATE <collation name>]
      
    • GROUP BY 句

      GROUP BY <expression> [COLLATE <collation name>]
      
    • 列の定義

      CREATE TABLE <table name> (
        <column name> <type name> [DEFAULT...] 
                                  [NOT NULL|UNIQUE|PRIMARY KEY|REFERENCES...]
                                  [COLLATE <collation name>], 
        ...
      )
      
    • ドメイン定義

      CREATE DOMAIN <domain name> [ AS ] <data type>
        [ DEFAULT ... ] [ CHECK ... ] [ COLLATE <collation name> ]
      
    • 文字セットの定義

      CREATE CHARACTER SET <character set name>
      [ AS ] GET <character set name> [ COLLATE <collation name> ]
      
  • 最初の 4 つのケースは JPA では使用できません。これらの SQL コマンドは JPA によって生成され、JPA 標準は照合をサポートしていないためです。

  • 最後の 3 つのケースは JPA で使用できます。
  • したがって、照合が「オン」になっている COLUMNS を使用して TABLES を作成すると、その後、ORDER BY、=、LIKE などで自動的に大文字と小文字が区別されます。次に、JPA での作業は必要ありません。変換や大文字と小文字の区別を無視するように要求する必要はありません。

3. ALTERNATIVE (PROPRIETARY) Oracle は、DB インスタンス全体で大文字と小文字を区別しない NLS 設定も提供します (構成ファイルで設定できます)。

ALTER SESSION SET NLS_COMP='BINARY';    -- Case Sensitive
ALTER SESSION SET NLS_COMP='ANSI';      -- Ignore for LIKE but not =,<,etc
ALTER SESSION SET NLS_COMP='LINGUISTIC';-- Ignore for LIKE,=,<,etc (post 10gR2)

ALTER SESSION SET NLS_SORT='BINARY' ;   -- Case Sensitive
ALTER SESSION SET NLS_SORT='BINARY_CI'; -- Ignore
ALTER SESSION SET NLS_SORT='XSPANISH';  -- Ignore according to language rules
ALTER SESSION SET NLS_SORT='LATIN1_GENERAL_CS';  

大文字と小文字を区別しないプラス関数

ORDER BY NLSSORT(supplier_name,'NLS_SORT=BINARY_CI') ;

これは次の方法で呼び出すことができます

criteriaBuilder.function("nlssort", String.class, dept_.suppler_name, "NLS_SORT=BINARY_CI");

そして、criteriaQuery.orderyByまたはselectなどを呼び出します

于 2013-05-28T03:52:24.467 に答える