JPA2:不区分大小写,就像在任何地方匹配
我一直在JPA 1.0(Hibernate驱动程序)中使用Hibernate
Restrictions。定义了Restrictions.ilike("column","keyword",
MatchMode.ANYWHERE)哪个测试关键字是否与任何地方的列匹配,并且不区分大小写。
现在,我将JPA 2.0与EclipseLink一起用作驱动程序,因此必须使用“ Restrictions”内置JPA
2.0。我找到了CriteriaBuilder
method
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标准?与休眠限制相比,这是尴尬且不舒服的解决方案。
还是有人可以帮助我如何将我的解决方案更改为不区分大小写?
非常感谢。
回答:
乍一看似乎有点尴尬,但是它是类型安全的。不是从字符串构建查询,因此您会在运行时而不是编译时注意到错误。通过使用缩进或单独执行每个步骤,可以使查询更具可读性,而不必在一行中编写整个WHERE子句。
为了使查询不区分大小写,请将关键字和被比较的字段都转换为小写:
query.where( builder.or(
builder.like(
builder.lower(
root.get(
type.getDeclaredSingularAttribute("username", String.class)
)
), "%" + keyword.toLowerCase() + "%"
),
builder.like(
builder.lower(
root.get(
type.getDeclaredSingularAttribute("firstname", String.class)
)
), "%" + keyword.toLowerCase() + "%"
),
builder.like(
builder.lower(
root.get(
type.getDeclaredSingularAttribute("lastname", String.class)
)
), "%" + keyword.toLowerCase() + "%"
)
)
);
以上是 JPA2:不区分大小写,就像在任何地方匹配 的全部内容, 来源链接: utcz.com/qa/408051.html