Ho utilizzato le restrizioni di ibernazione in JPA 1.0 (driver Hibernate). È definito Restrictions.ilike("column","keyword", MatchMode.ANYWHERE)
che verifica se la parola chiave corrisponde alla colonna in qualsiasi punto e non fa distinzione tra maiuscole e minuscole.JPA2: senza distinzione tra maiuscole e minuscole come l'abbinamento ovunque
Ora, sto usando JPA 2.0 con EclipseLink come driver, quindi devo usare "Restrizioni" build-in JPA 2.0. Ho trovato CriteriaBuilder
e il metodo like
, ho anche scoperto come farlo corrispondere ovunque (anche se è impressionante e manuale), ma ancora non ho capito come farlo senza distinzione tra maiuscole e minuscole.
C'è il mio attuale soluzione pessima:
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
EntityType<User> type = em.getMetamodel().entity(User.class);
Root<User> root = query.from(User.class);
// Where
// important passage of code for question
query.where(builder.or(builder.like(root.get(type.getDeclaredSingularAttribute("username", String.class)), "%" + keyword + "%"),
builder.like(root.get(type.getDeclaredSingularAttribute("firstname", String.class)), "%" + keyword + "%"),
builder.like(root.get(type.getDeclaredSingularAttribute("lastname", String.class)), "%" + keyword + "%")
));
// Order By
query.orderBy(builder.asc(root.get("lastname")),
builder.asc(root.get("firstname")));
// Execute
return em.createQuery(query).
setMaxResults(PAGE_SIZE + 1).
setFirstResult((page - 1) * PAGE_SIZE).
getResultList();
Domande:
C'è qualche funzione come nel conducente Ibernazione?
Sto utilizzando correttamente i criteri JPA 2.0? Questa è una soluzione scomoda e scomoda in confronto alle restrizioni di ibernazione.
Oppure qualcuno può aiutarmi a cambiare la mia soluzione senza distinzione tra maiuscole e minuscole, per favore?
Grazie mille.
Sono anche migrando da Hibernate a JPA e ho trovato l'API di JPA per essere un po '... non chiara a volte. E sembra che ci siano molti modi diversi per realizzare la stessa cosa - alcuni più prolissi di altri. Credo che questo sarebbe un modo "più amichevole" di formare affermazioni simili: builder.like (builder.lower (radice: get ("username")), "%" + keyword.toLowerCase() + "%") –
spaaarky21
Penso che sia meglio usare un [JPA Static Metamodel Generator] (https://docs.jboss.org/hibernate/orm/5.0/topical/html/metamodelgen/MetamodelGenerator.html). Assicurerà che le proprietà esistano in fase di compilazione e conosce i tipi ;-) – TheConstructor
Attenzione, confrontare la stringa abbassata dall'SGBD con una stringa abbassata da java può causare differenze per il carattere accentato. Esempio: Java: "EÉÊÈ" .toLower() = "eÉÊÈ" mentre postgresql inferiore ('EÉÊÈ') = 'eéêè'. Sto cercando un modo per dedicare de 'lower' tutti al SGBD – Ghurdyl