不区分大小写等于使用Hibernate Criteria

时间:2009-03-09 00:13:17

标签: java hibernate

我见过Restrictions.ilike('property','%value%'),但想生成SQL,如:lower(property)='value'。有什么想法吗?

我用过:

Restrictions.eq("email", email).ignoreCase()

因为不推荐使用Expression。 SimpleExpression将在值上调用toLowerCase(),因此不必事先进行。

请参阅:SimpleExpression source

7 个答案:

答案 0 :(得分:74)

表达式现已弃用。请改为使用限制......

crit(Restrictions.eq("firstName", firstName).ignoreCase());

答案 1 :(得分:69)

小心使用ilike因为它会允许某人输入“test%”之类的东西并匹配。我使用以下内容在一个应用程序中执行不区分大小写:

...
Criteria crit=session.createCriteria(Event.class);
crit.add(Expression.eq("rsvpCode","test1").ignoreCase());
...

答案 2 :(得分:11)

正如安迪的回答所暗示的那样,这是针对不区分大小写的搜索,但它也适用于Hibernate版本 4.1

crit(Restrictions.eq("firstName", firstName).ignoreCase());
Hibernate的

版本4.1.1及更高版本不支持ignoreCase()上的Restriction.eq()方法。为此,我们必须将ilikeMatchMode一起使用。

Criteria crit = session.createCriteria(ENTITY.class);
crit.add(Restrictions.ilike('PROPERTY NAME', 'VALUE', MatchMode.ANYWHERE));

例如,对于具有 id,name,surname 属性的 USER 实体,基于名称的不区分大小写的搜索将为:

Criteria crit = session.createCriteria(USER.class);
crit.add(Restrictions.ilike('name', 'Satyam', MatchMode.ANYWHERE));

这将返回所有结果,不区分大小写。

答案 3 :(得分:7)

我不是很确定,但是当你使用Restriction.eq时,你获得了一个SimpleExpression对象,并且该对象支持一个我从未尝试过的ignoreCase()操作,但听起来它可能会有所作为。

感谢Hibernate不记录此方法实际执行的操作。

答案 4 :(得分:1)

如果要求是lower(property) = 'value',那么最好的方法是使用带有ignoreCase()的Restrictions.eq而不是在这里使用ilike cuz来确定确切的值。在搜索模式或我们不知道确切值时,ilike很有用。 ignoreCase()的唯一问题是,它不会将您的结果限制为小写,也包括其他情况下的结果 ,但我认为这是休眠提供的唯一可用选项。

 Criteria criteria = session.createCriteria(ClassName.class);
 criteria.add(Restrictions.eq("PROPERTY", propertyName).ignoreCase()).uniqueResult();

现在,如果我正确理解了您的问题,则您的数据库具有以下值: ABC,abc,aBC,aBc ...等等,您想要将它们转换为小写,然后与一些值进行比较,例如“ ABC”或“ abc”。您可以通过进一步处理您获得的列表来做到这一点。

您可以将此结果保存在列表中。

List<ClassName> listOfAllMatches =  criteria.list(); // gives all matched results (ABC, abc, aBC, aBc)



List<ClassName> finalResult = listOfAllMatches.stream().map(x -> x.getPropertyName().toLowerCase()).filter(y ->y.getPropertyName()== value).collect(Collectors.toList());

//convert this field to lower case using map() and filter your results with filter() function.

您可以进一步将此列表添加到“条件”中并进行处理。

答案 5 :(得分:0)

crit(Restrictions.eq("firstName", firstName).ignoreCase());有效。

这确实返回SimpleExpression Object,但它会生成lower(firstname)个查询。这样可行。

答案 6 :(得分:0)

您可以使用Criterion.ilike。有关更多信息,请检查此conditional view modifiers