我一直在 JPA 1.0(Hibernate 驱动程序)中使用 Hibernate 限制。定义了 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 相比,这是一个笨拙和不舒服的解决方案。
或者有人可以帮助我如何将我的解决方案更改为不区分大小写吗?
非常感谢。
原文由 Gaim 发布,翻译遵循 CC BY-SA 4.0 许可协议
起初看起来有点笨拙,但它是类型安全的。从字符串构建查询不是,因此您会在运行时而不是编译时注意到错误。您可以通过使用缩进或单独执行每个步骤来使查询更具可读性,而不是在一行中编写整个 WHERE 子句。
要使您的查询不区分大小写,请将您的关键字和比较字段都转换为小写: