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.
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.
Come possiamo fare un ignorecase nel generatore di criteri
1. Forza ignorecase in JPA programma - fa il lavoro, risponde alla Q Direttamente
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.
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
Come viene definito "Person_.surname"? –
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
non ha aiutato il collegamento – ronan
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