基準ビルダーで ignorecase を実行するにはどうすればよいですか? 私が持っている場合
private final CriteriaBuilder cb
次に、cb.asc
またはのみを使用できますcb.desc
が、大文字と小文字を無視することはできません。
基準ビルダーで ignorecase を実行するにはどうすればよいですか
1. JPA プログラムで Ignorecase を強制する - ジョブを実行し、Q に直接回答する
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. 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
などを呼び出します