Làm thế nào chúng ta có thể làm một IgnoreCase trong xây dựng tiêu chí
1. Lực lượng IgnoreCase trong Chương trình JPA - Liệu công việc, câu trả lời Q Trực tiếp
- Đối với một hoạt động một-arg (tức là ORDER BY), chuyển đổi đối số thành chữ thường (hoặc chữ hoa).
- Đối với hoạt động hai arg (ví dụ = hoặc LIKE hoặc ORDER BY), chuyển đổi cả hai arg thành LC (hoặc UC).
JPA ORDER BY Hai Cột, Bỏ qua trường hợp:
Order lcSurnameOrder = criteriaBuilder.order(
criteriaBuilder.lower(Person_.surname));
Order lcFirstnameOrder = criteriaBuilder.order(
criteriaBuilder.lower(Person_.firstname));
criteriaQuery.orderBy(lcSurnameOrder, lcFirstnameOrder);
JPA LIKE, Bỏ qua trường hợp:
Predicate lcSurnameLikeSearchPattern = criteriaBuilder.like(
criteriaBuilder.lower(Person_.surname),
searchPattern.toLowerCase());
criteriaQuery.where(lcSurnameLikeSearchPattern);
Giả Person_ kinh điển lớp metamodel được tạo ra từ Người tổ chức nào, để cung cấp cho strong- đánh máy sử dụng API tiêu chí JPA.
CHỈ DẪN: Để có hiệu suất tốt nhất & kiểm soát, hãy xem xét chuyển đổi các cột chuỗi thành LOWER case hoặc INITCAP case chỉ một lần - khi bạn INSERT/UPDATE vào cơ sở dữ liệu. Thực hiện cùng một chuyển đổi cho các mẫu tìm kiếm do người dùng nhập.
2. THAY THẾ: Áp dụng Collation trong Cơ sở dữ liệu - Thực hành tốt nhất, đơn giản hơn, Nhiều hơn Performant
Tiêu chuẩn SQL-99 có một built-in modifer để so sánh nhân vật trong Strings theo quy tắc:
COLLATE <collation name>
Có thể sử dụng khi so sánh, sắp xếp và nhóm theo chuỗi.Một ví dụ phổ biến mà bỏ qua trường hợp:
COLLATE SQL_Latin1_General_CP1_CI_AS
Hoặc
COLLATE latin1_general_cs
Bạn thậm chí có thể tạo ra đối chiếu tùy chỉnh của riêng bạn:
CREATE COLLATION <collation name> FOR <character set specification>
FROM <existing collation name> [ <pad characteristic> ]
Collation được áp dụng trong DB thông qua một trong các cách sau các lựa chọn thay thế (từ bản địa hóa đến hiệu ứng toàn cục):
mệnh đề where (=, loại tương tự có,>,> =, vv)
WHERE <expression> = <expression> [COLLATE <collation name>]
WHERE <expression> LIKE <expression> [COLLATE <collation name>]
SELECT DISTINCT khoản
SELECT DISTINCT <expression> [COLLATE <collation name>], ...
ORDER BY khoản
ORDER BY <expression> [COLLATE <collation name>]
GROUP BY khoản
GROUP BY <expression> [COLLATE <collation name>]
Column Definition
CREATE TABLE <table name> (
<column name> <type name> [DEFAULT...]
[NOT NULL|UNIQUE|PRIMARY KEY|REFERENCES...]
[COLLATE <collation name>],
...
)
miền Definition
CREATE DOMAIN <domain name> [ AS ] <data type>
[ DEFAULT ... ] [ CHECK ... ] [ COLLATE <collation name> ]
Nhân vật Set Definition
CREATE CHARACTER SET <character set name>
[ AS ] GET <character set name> [ COLLATE <collation name> ]
4 trường hợp đầu tiên không thể được sử dụng với JPA, bởi vì các lệnh SQL được tạo ra bởi JPA, và tiêu chuẩn JPA không hỗ trợ đối chiếu.
- 3 trường hợp cuối cùng có thể được sử dụng với JPA.
- Vì vậy: tạo TABLES có COLUMNS có collation "bật" và sau đó ORDER BY, =, LIKE, v.v. sẽ bỏ qua trường hợp tự động. Sau đó, không yêu cầu công việc trong JPA - không cần bất kỳ chuyển đổi nào hoặc yêu cầu bỏ qua trường hợp.
3.THAY THẾ (HỮU) Oracle còn cung cấp các thiết lập NLS để bỏ qua trường hợp trên toàn bộ dụ DB (có thể được thiết lập trong file config):
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';
Thêm chức năng bỏ qua trường hợp như một lần
ORDER BY NLSSORT(supplier_name,'NLS_SORT=BINARY_CI') ;
Bạn có thể gọi đây là qua
criteriaBuilder.function("nlssort", String.class, dept_.suppler_name, "NLS_SORT=BINARY_CI");
và sau đó gọi criteriaQuery.orderyBy
hoặc select
, vv
có thể trùng lặp của [JPA2: Phân biệt chữ hoa chữ thường giống như khớp với bất kỳ nơi nào] (http://stackoverflow.com/questions/4580285/jpa2-case-insensitive-like-matching-anywhere) – weltraumpirat
không giúp liên kết – ronan
. Như bạn đã chỉ ra, không có tùy chọn để kích hoạt tính năng ignorecase trên CriteriaBuilder. Do đó, chỉ cần chuyển đổi cả cụm từ tìm kiếm và kết quả thành chữ hoa hoặc chữ thường và bạn sẽ đạt được điều tương tự. – weltraumpirat