Używam ograniczeń Hibernate w JPA 1.0 (sterownik Hibernate). Zdefiniowano parametr Restrictions.ilike("column","keyword", MatchMode.ANYWHERE)
, który sprawdza, czy słowo kluczowe pasuje do kolumny w dowolnym miejscu i nie rozróżnia wielkości liter.JPA2: Niewrażliwe na wielkość liter jak dopasowanie wszędzie
Teraz używam JPA 2.0 z EclipseLink jako sterownika, więc muszę użyć "Ograniczenia" wbudowanego JPA 2.0. Znalazłem CriteriaBuilder
i metodę like
, również dowiedziałem się, jak sprawić, by pasowało to wszędzie (choć jest straszne i ręczne), ale nadal nie wiem, jak to zrobić, nie rozróżniając wielkości liter.
Jest mój obecny straszne rozwiązanie:
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();
Pytania:
Czy istnieje funkcja jak w sterowniku hibernacji?
Czy poprawnie stosuję kryteria JPA 2.0? Jest to niewygodne i niewygodne rozwiązanie w porównaniu z ograniczeniami Hibernate.
Czy ktoś może mi pomóc, jak zmienić moje rozwiązanie, aby nie było w nim rozróżniane wielkości liter?
Wielkie dzięki.
jestem również migracja z Hibernate do JPA i odkryłem, że API JPA jest trochę ... niejasne. I wydaje się, że istnieje wiele różnych sposobów osiągnięcia tego samego - niektóre bardziej szczegółowe niż inne. Wierzę, że byłby to "bardziej przyjazny" sposób tworzenia takich instrukcji: builder.like (builder.lower (root: get ("username")), "%" + keyword.toLowerCase() + "%") –
spaaarky21
Myślę, że najlepiej jest użyć [JPA Static Metamodel Generator] (https://docs.jboss.org/hibernate/orm/5.0/topical/html/metamodelgen/MetamodelGenerator.html). Zapewni to, że właściwości istnieją podczas kompilacji i zna typy ;-) – TheConstructor
Uważaj, porównywanie ciągów obniżonych przez SGBD z ciągiem obniżonym przez java może spowodować różnice dla znaków akcentowanych. Przykład: Java: "EÉÊÈ" .toLower() = "eÉÊÈ", podczas gdy postgresql lower ('EÉÊÈ') = 'eéêè'. Szukam sposobu, aby poświęcić de "niższy" wszystko na SGBD – Ghurdyl