我正在将Hibernate用于我的Java应用程序的ORM到Oracle数据库(不是说数据库供应商很重要,我们可能有一天会切换到另一个数据库),我想根据用户提供的数据库检索对象字符串。例如,在搜索人员时,如果用户正在寻找居住在“fran”中的人,我希望能够在旧金山为她的员工提供服务。
SQL不是我的强项,我更喜欢Hibernate的Criteria
构建代码,而不是硬编码字符串。任何人都可以指出我在如何在代码中执行此操作的正确方向,如果不可能,硬编码的SQL应该如何?
谢谢,
Yuval = 8 - )
答案 0 :(得分:70)
对于您描述的简单情况,请查看Restrictions.ilike(),它执行不区分大小写的搜索。
Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', '%fran%');
List results = crit.list();
答案 1 :(得分:36)
Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', 'fran', MatchMode.ANYWHERE);
List results = crit.list();
答案 2 :(得分:9)
如果您使用Spring的HibernateTemplate与Hibernate进行交互,那么您可以通过以下方式对用户的电子邮件地址进行不区分大小写的搜索:
getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase());
答案 3 :(得分:4)
忽略大小写的常用方法是将数据库值和输入值都转换为大写或小写 - 结果sql会有类似
的内容select f.name from f where TO_UPPER(f.name) like '%FRAN%'
在hibernate条件中limits.like(...)。ignoreCase()
我对Nhibernate更熟悉,因此语法可能不是100%准确
了解更多信息,请参阅pro hibernate 3 extract和hibernate docs 15.2. Narrowing the result set
答案 4 :(得分:4)
您也不必输入'%'通配符。您可以传递MatchMode(docs for previous releases here)来告诉搜索如何表现。可以选择START
,ANYWHERE
,EXACT
和END
匹配。
答案 5 :(得分:0)
大多数默认数据库排序规则不区分大小写,但在SQL Server环境中,可以在实例,数据库和列级别设置它。
答案 6 :(得分:0)
你可以看一下使用Compass上面的lucene包装器。
http://www.compass-project.org/
通过在域对象中添加一些注释,您就可以实现这一目标。
Compass提供了一个用于处理Lucene的简单API。如果您知道如何使用ORM,那么您将感到宾至如归,Compass具有简单的保存操作,并且删除&查询。
来自网站本身。 “构建于Lucene之上,Compass简化了Lucene的常见使用模式,例如谷歌式搜索,索引更新以及更高级的概念,如缓存和索引分片(子索引).Compass还使用内置优化进行并发提交和合并“。
我过去曾经使用过它,我发现它很棒。
答案 7 :(得分:0)
这也可以使用org.hibernate.criterion包中的标准Example来完成。
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();
}
我发现另一种有用的方法可以完成上述工作。
答案 8 :(得分:0)
自Hibernate 5.2 session.createCriteria
起已弃用。以下是使用JPA 2 CriteriaBuilder的解决方案。它使用like
和upper
:
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();