2013-05-17 10 views
9

Come possiamo fare un ignorecase nel generatore di criteri? Se hoignorecase in Criteri di builder in JPA

private final CriteriaBuilder cb 

allora posso usare solo cb.asc o cb.desc, ma non caso ignorare.

+0

possibile duplicato di [JPA2: senza distinzione tra maiuscole e minuscole come la corrispondenza dovunque] (http://stackoverflow.com/questions/4580285/jpa2-case-insensitive-like-matching-anywhere) – weltraumpirat

+0

non ha aiutato il collegamento – ronan

+0

Dovrebbe. Come hai sottolineato, non è possibile abilitare ignorecase su CriteriaBuilder. Pertanto, converti sia il termine di ricerca sia il risultato in maiuscolo o minuscolo e otterrai la stessa cosa. – weltraumpirat

risposta

34

Come possiamo fare un ignorecase nel generatore di criteri

1. Forza ignorecase in JPA programma - fa il lavoro, risponde alla Q Direttamente

  • Per un operazione con un solo arg (es. ORDER BY), converte l'argomento in minuscolo (o maiuscolo).
  • Per un'operazione a due arg (ad es. = O LIKE o ORDER BY), convertire entrambi gli argomenti in LC (o UC).

JPA ORDER da due colonne, maiuscole e minuscole:

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

JPA COME, maiuscole e minuscole:

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

Considerando una Person_ canonica classe metamodello è stata generata da entità persona, per dare forte- uso tipizzato dell'API dei criteri JPA.

SUGGERIMENTO: per le migliori prestazioni del controllo &, prendere in considerazione la conversione di colonne stringa in caso LOWER o INITCAP una volta sola - quando si inserisce/AGGIORNA nel database. Fai la stessa conversione per i pattern di ricerca inseriti dall'utente.

2. ALTERNATIVA: Applicare regole di confronto nel database - Best Practice, più semplice, più performante

  • Lo standard SQL-99 è dotato di un modificatore di confrontare i caratteri nelle stringhe in base alle leggi:

    COLLATE <collation name> 
    

    possibile utilizzare quando si confrontano, l'ordinamento e il raggruppamento sulle stringhe.Un esempio comune che ignora caso:

    COLLATE SQL_Latin1_General_CP1_CI_AS 
    

    O

    COLLATE latin1_general_cs 
    

    È anche possibile creare il proprio confronto personalizzato:

    CREATE COLLATION <collation name> FOR <character set specification> 
        FROM <existing collation name> [ <pad characteristic> ] 
    
  • fascicolazione viene applicato nel DB tramite una delle seguenti alternative (dall'effetto localizzato a quello globale):

    • clausola WHERE (=, simili, muniti,>,> =, ecc)

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

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

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

      GROUP BY <expression> [COLLATE <collation name>] 
      
    • Colonna Definizione

      CREATE TABLE <table name> (
          <column name> <type name> [DEFAULT...] 
                [NOT NULL|UNIQUE|PRIMARY KEY|REFERENCES...] 
                [COLLATE <collation name>], 
          ... 
      ) 
      
    • definizione di dominio

      CREATE DOMAIN <domain name> [ AS ] <data type> 
          [ DEFAULT ... ] [ CHECK ... ] [ COLLATE <collation name> ] 
      
    • Set di caratteri Definizione

      CREATE CHARACTER SET <character set name> 
      [ AS ] GET <character set name> [ COLLATE <collation name> ] 
      
  • I primi 4 casi non possono essere utilizzati con JPA, perché questi comandi SQL vengono generate da APP, e lo standard JPA non supporta la fascicolazione.

  • Gli ultimi 3 casi possono essere utilizzati con JPA.
  • Quindi: creare TABELLE con COLONNE che hanno regole di confronto "attivate" e successivamente ORDINA PER, =, LIKE, ecc ignorerà automaticamente il caso. Quindi non è richiesto alcun lavoro in JPA - non è necessaria alcuna conversione o richiesta di ignorare il caso.

3.ALTERNATIVA (Proprietary) Oracle fornisce anche le impostazioni NLS di ignorare caso su tutta DB di istanza (può essere impostato nei file di configurazione):

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 funzioni di ignorare caso, come una tantum

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

È può chiamare questa via

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

e quindi chiamare criteriaQuery.orderyBy o select, ecc

+0

Come viene definito "Person_.surname"? –

Problemi correlati