JPA 1.0(Hibernateドライバ)でHibernate Restrictionsを使用しています。 Restrictions.ilike("column","keyword", MatchMode.ANYWHERE)
が定義されています。このキーワードは、キーワードがどこにでも一致するかどうかをテストし、大文字と小文字を区別しません。JPA2:どこでもマッチするような大文字小文字の区別なし
EclipseLinkをドライバとしてJPA 2.0を使用していますので、JPA 2.0の「制限」を使用する必要があります。私はCriteriaBuilder
と方法like
を見つけました。私はそれをどこでも一致させる方法を見つけましたが(それは恐ろしいマニュアルですが)、それでも大文字と小文字を区別しない方法を考え出していません。
私の現在のawefulソリューションがあります:
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();
質問:
は、Hibernateのドライバのように任意の機能がありますか?
JPA 2.0基準を正しく使用していますか?これは、Hibernateの制限と比較して、扱いにくく、不快な解決策です。
また、大文字小文字を区別しないようにソリューションを変更する方法を教えてもらえますか?
ありがとうございます。
:だから完全なソリューションは次のようになり
:
私は最終的にリテラル式を使用してDBMSはすべて下げないようにすることですはるかに安全解決策を見つけましたまた、HibernateからJPAに移行すると、JPAのAPIが少しはっきりしないことが判明しました。同じことを達成するための方法はたくさんあるようです。他の方法よりも冗長な方法がいくつかあります。 builder.like(builder.lower(root。 get( "username"))、 "%" + keyword.toLowerCase()+ "%") –
spaaarky21
このようなステートメントを作成するには、私は[JPA静的メタモデルジェネレータ](https://docs.jboss.org/hibernate/orm/5.0/topical/html/metamodelgen/MetamodelGenerator.html)を使用するのが最善だと思います。それはコンパイル時にプロパティが存在することを保証し、型を知っている;-) – TheConstructor
SGBDによって下げられた文字列とjavaによって下げられた文字列を比較することは、アクセント付き文字の違いを引き起こすかもしれません。 例:Java: "EÉÊÈ" .toLower()= "eÉÊÈ"、postgresql lower( 'EÉÊÈ')= 'eéêè'です。私はSGBDに全て「下位」を捧げる方法を探しています – Ghurdyl