Ich habe Hibernate-Einschränkungen in JPA 1.0 (Hibernate-Treiber) verwendet. Es ist Restrictions.ilike("column","keyword", MatchMode.ANYWHERE)
definiert, die testet, ob das Schlüsselwort die Spalte irgendwo und die Groß-/Kleinschreibung nicht beachtet.JPA2: Groß-/Kleinschreibung nicht beachten, wie überall passend
Jetzt benutze ich JPA 2.0 mit EclipseLink als Treiber, also muss ich "Einschränkungen" einbauen JPA 2.0 verwenden. Ich fand CriteriaBuilder
und Methode like
, ich habe auch herausgefunden, wie man es überall (obwohl es aweful und manuell ist), aber immer noch habe ich nicht herausgefunden, wie es die Groß-/Kleinschreibung nicht beachten.
Es ist meine aktuelle aweful Lösung:
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();
Fragen:
Gibt es eine Funktion wie in Hibernate-Treiber?
Verwende ich die JPA 2.0-Kriterien richtig? Dies ist eine peinliche und unkomfortable Lösung im Vergleich zu Einschränkungen im Ruhezustand.
Oder kann mir bitte jemand helfen, meine Lösung so zu ändern, dass die Groß-/Kleinschreibung nicht beachtet wird?
Vielen Dank.
Ich bin auch Migration von Hibernate zu JPA und ich habe festgestellt, dass JPA's API ein wenig ... unklar zu Zeiten ist. Und es scheint eine Menge verschiedener Möglichkeiten zu geben, dasselbe zu erreichen - einige mehr als andere. Ich glaube, das wäre eine "freundlichere" Art, solche Aussagen zu bilden: builder.like (builder.lower (root. get ("benutzername")), "%" + keyword.toLowerCase() + "%") –
spaaarky21
Ich denke, es ist am besten, einen [JPA Static Metamodel Generator] zu verwenden (https://docs.jboss.org/hibernate/orm/5.0/topical/html/metamodelgen/MetamodelGenerator.html). Es stellt sicher, dass die Eigenschaften zum Zeitpunkt der Kompilierung existieren und kennt die Typen ;-) – TheConstructor
Vorsicht, der Vergleich der durch SGBD gesenkten Zeichenkette mit der durch Java gesenkten Zeichenkette kann zu Unterschieden bei akzentuierten Zeichen führen. Beispiel: Java: "EÉÊÈ" .toLower() = "eÉÊÈ" während postgresql niedriger ('EÉÊÈ') = 'eéêè'. Ich bin auf der Suche nach einer Möglichkeit, de 'Lower' alle auf die SGBD widmen – Ghurdyl