web-dev-qa-db-ja.com

JPAの基準ビルダーのignorecase

基準ビルダーでどのようにしてigno​​recaseを実行できますか?私が持っている場合

private final CriteriaBuilder cb

その後、私はcb.ascまたはcb.desc、ただし大文字と小文字を区別しません。

17
ronan

条件ビルダーでどのようにしてigno​​recaseを実行できますか

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);

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

ヒント:最高のパフォーマンスと制御を実現するには、データベースに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での作業は不要です-いいえ変換が必要か、大文字と小文字を区別しないように要求します。

。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';  

Plusは、ケースを1回限りとして無視する機能

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

あなたはこれを呼び出すことができます

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

次にcriteriaQuery.orderyByまたはselectなどを呼び出します

47
Glen Best