当前位置: 首页 > 面试题库 >

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

岑俊弼
2023-03-14
问题内容

我一直在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() + "%"
        )
    )
);


 类似资料:
  • 我试图在Elasticseach 7中实现部分的、区分大小写的匹配。 我正在使用设置创建索引: 以及映射: 以下查询将正确返回文档: 但当我将搜索词小写时,它不会返回文档: 如何配置Elasticsearch,使其与使用小写搜索词的名称字段值匹配?

  • 如何在Java中以区分大小写的方式进行匹配?我的意思是,我想编写一个类似的regex。但是我想匹配以及等等。在Java中最简单的方法是什么?

  • 对于报告(0.1%的所有查询),我需要返回一个所有可能类别的列表,区分大小写! 考虑以下文件: 运行以下查询: 返回: 是否有方法返回区分大小写的类别(存储在文档中)?我对此查询结果中的感兴趣。 Elasticsearch论坛中的问题 谢谢,伊泰

  • 我想让用户选择进行区分大小写或不区分大小写的搜索。 我的想法是使用区分大小写的分析器对数据进行索引,然后根据用户输入使用区分大小写或不区分大小写的分析器进行搜索。 因此,我创建了区分大小写的分析器,下面是我的简单代码: 对于索引,我使用了以下方法: 对于搜索,我使用: 当我对此感到厌倦时,敏感的案例起了作用,但不敏感的案例没有起作用。 经过更多的研究,我发现使用区分大小写的分析器和低关注度的查询是

  • 问题内容: 我正在尝试提出一个要求区分大小写的结果的请求。 例如在我的数据库中 该请求是 但我有3行作为结果,我只想要abcdef 我试图找到一个解决方案 但是我有这个错误: 未知归类:’Latin1_General_CS_AS’{“成功”:false,“错误”:“#1273-未知归类:’Latin1_General_CS_AS’”} 谢谢 问题答案: 感谢您的帮助,我找到了不是latin1 ut