50

我正在使用 Hibernate 将我的 Java 应用程序的 ORM 用于 Oracle 数据库(不是数据库供应商很重要,我们可能有一天会切换到另一个数据库),我想根据用户提供的字符串从数据库中检索对象。例如,在搜索人时,如果用户正在寻找住在“弗兰”的人,我希望能够给她在旧金山的人。

SQL 不是我的强项,我更喜欢 Hibernate 的Criteria构建代码而不是硬编码字符串。谁能指出我如何在代码中做到这一点的正确方向,如果不可能,硬编码的 SQL 应该是什么样子?

谢谢,

尤瓦尔=8-)

4

9 回答 9

72

对于您描述的简单案例,请查看 Restrictions.ilike(),它执行不区分大小写的搜索。

Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', '%fran%');
List results = crit.list();
于 2008-09-23T12:26:16.180 回答
38
Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', 'fran', MatchMode.ANYWHERE);
List results = crit.list();
于 2008-11-14T14:00:21.187 回答
9

如果您使用 Spring 的 HibernateTemplate 与 Hibernate 交互,那么您将如何对用户的电子邮件地址进行不区分大小写的搜索:

getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase());
于 2008-10-22T19:30:46.757 回答
4

忽略大小写的常用方法是将数据库值和输入值都转换为大写或小写 - 生成的 sql 将具有类似

select f.name from f where TO_UPPER(f.name) like '%FRAN%'

在休眠标准中,restrictions.like(...).ignoreCase()

我对 Nhibernate 更熟悉,所以语法可能不是 100% 准确

有关更多信息,请参阅pro hibernate 3 extracthibernate docs 15.2。缩小结果集

于 2008-09-23T12:22:00.667 回答
4

您也不必输入“%”通配符。您可以传递MatchMode此处为以前版本的文档)来告诉搜索如何表现。 STARTANYWHEREEXACTEND匹配是选项。

于 2008-09-23T14:36:36.227 回答
1

这也可以使用 org.hibernate.criterion 包中的标准示例来完成。

public List findLike(Object entity, MatchMode matchMode) {
    Example example = Example.create(entity);
    example.enableLike(matchMode);
    example.ignoreCase();
    return getSession().createCriteria(entity.getClass()).add(
            example).list();
}

只是我发现完成上述任务的另一种方式。

于 2010-11-03T17:37:17.107 回答
1

由于不推荐使用 Hibernate 5.2 session.createCriteria。以下是使用 JPA 2 CriteriaBuilder 的解决方案。它使用likeupper

    CriteriaBuilder builder = session.getCriteriaBuilder();
    CriteriaQuery<Person> criteria = builder.createQuery(Person.class);
    Root<Person> root = criteria.from(Person.class);

    Expression<String> upper = builder.upper(root.get("town"));
    criteria.where(builder.like(upper, "%FRAN%"));

    session.createQuery(criteria.select(root)).getResultList();
于 2019-09-19T18:59:34.337 回答
0

大多数默认数据库排序规则不区分大小写,但在 SQL Server 世界中,它可以在实例、数据库和列级别进行设置。

于 2008-09-23T12:17:35.500 回答
0

您可以查看在 lucene 之上使用 Compass 包装器。

http://www.compass-project.org/

通过向您的域对象添加一些注释,您可以实现这种事情。

Compass 为使用 Lucene 提供了一个简单的 API。如果您知道如何使用 ORM,那么您会对 Compass 感到宾至如归,只需简单的保存、删除和查询操作即可。

从网站本身。“在 Lucene 之上构建,Compass 简化了 Lucene 的常见使用模式,例如 google 风格的搜索、索引更新以及更高级的概念,例如缓存和索引分片(子索引)。Compass 还使用内置优化来实现并发提交和合并。”

我过去用过这个,我觉得它很棒。

于 2008-09-23T12:18:32.783 回答