我见过Restrictions.ilike('property','%value%'),但想生成SQL,如:lower(property)='value'。有什么想法吗?
我用过:
Restrictions.eq("email", email).ignoreCase()
因为不推荐使用Expression。 SimpleExpression将在值上调用toLowerCase(),因此不必事先进行。
答案 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()
方法。为此,我们必须将ilike
与MatchMode
一起使用。
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。