2013-05-17 44 views
9

Làm cách nào để chúng tôi có thể thực hiện bỏ qua trong trình tạo tiêu chí? Nếu tôi cóignorecase trong trình xây dựng tiêu chí trong JPA

private final CriteriaBuilder cb 

thì tôi chỉ có thể sử dụng cb.asc hoặc cb.desc, nhưng không bỏ qua trường hợp.

+0

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

+0

không giúp liên kết – ronan

+0

. 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

Trả lời

34

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

+0

'Person_.surname' được định nghĩa như thế nào? –

Các vấn đề liên quan