JPA2:不区分大小写,就像在任何地方匹配

我一直在JPA 1.0(Hibernate驱动程序)中使用Hibernate

Restrictions。定义了Restrictions.ilike("column","keyword",

MatchMode.ANYWHERE)哪个测试关键字是否与任何地方的列匹配,并且不区分大小写。

现在,我将JPA 2.0与EclipseLink一起用作驱动程序,因此必须使用“ Restrictions”内置JPA

2.0。我找到了CriteriaBuildermethod

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

回到顶部