gpt4 book ai didi

java - JPA2 : Case-insensitive like matching anywhere

转载 作者:IT老高 更新时间:2023-10-28 20:35:56 26 4
gpt4 key购买 nike

我一直在 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 相比,这是一种尴尬且不舒服的解决方案。

或者任何人都可以帮助我如何将我的解决方案更改为不区分大小写吗?

非常感谢。

最佳答案

一开始可能看起来有点尴尬,但它是类型安全的。不是从字符串构建查询,因此您会在运行时而不是在编译时注意到错误。您可以通过使用缩进或单独执行每个步骤来使查询更具可读性,而不是在一行中编写整个 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() + "%"
)
)
);

关于java - JPA2 : Case-insensitive like matching anywhere,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4580285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com