我一直在 JPA 1.0(休眠驱动程序)中使用休眠限制。定义Restrictions.ilike("column","keyword", MatchMode.ANYWHERE)
了哪些测试关键字是否与任何地方的列匹配并且不区分大小写。
现在,我使用 JPA 2.0 和 EclipseLink 作为驱动程序,所以我必须使用“限制”内置 JPA 2.0。我找到了CriteriaBuilder
方法like
,我也找到了如何让它在任何地方匹配(虽然它很可怕而且手动),但我仍然没有弄清楚如何做到不区分大小写。
我目前有一个很棒的解决方案:
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 Restrictions 相比,这是一种尴尬且不舒服的解决方案。
或者任何人都可以帮助我如何将我的解决方案更改为不区分大小写,好吗?
非常感谢。