[英]Case-insensitive equals using Hibernate Criteria
我見過 Restrictions.ilike('property', '%value%'),但想生成 SQL,例如:lower(property) = 'value'。 有任何想法嗎?
我用了:
Restrictions.eq("email", email).ignoreCase()
因為不推薦使用表達式。 SimpleExpression 將對值調用 toLowerCase(),因此無需事先進行。
請參閱: SimpleExpression 源
現在不推薦使用表達式。 改為使用限制...
crit(Restrictions.eq("firstName", firstName).ignoreCase());
使用 ilike 時要小心,因為它會允許某人輸入“test%”之類的內容並進行匹配。 我使用以下內容在一個應用程序中執行不區分大小寫的相等操作:
...
Criteria crit=session.createCriteria(Event.class);
crit.add(Expression.eq("rsvpCode","test1").ignoreCase());
...
正如安迪的回答所暗示的,這適用於不區分大小寫的搜索,但它也適用於 Hibernate 4.1版:
crit(Restrictions.eq("firstName", firstName).ignoreCase());
Hibernate 的4.1.1 及更高版本不支持Restriction.eq()
上的ignoreCase()
方法。 為此,我們必須將ilike
與MatchMode
一起使用。
Criteria crit = session.createCriteria(ENTITY.class);
crit.add(Restrictions.ilike('PROPERTY NAME', 'VALUE', MatchMode.ANYWHERE));
例如,對於具有id、name、surname屬性的USER實體,基於 name 的不區分大小寫的搜索將是:
Criteria crit = session.createCriteria(USER.class);
crit.add(Restrictions.ilike('name', 'Satyam', MatchMode.ANYWHERE));
這將返回所有結果,不區分大小寫。
我不確定,但是當您使用 Restriction.eq 時,您會獲得一個 SimpleExpression object,並且 object 支持一個我從未嘗試過使用的 ignoreCase() 操作,但聽起來它可能會有所作為。
感謝 Hibernate 沒有記錄此方法的實際作用。
如果要求lower(property) = 'value'
,最好的方法是將 Restrictions.eq 與 ignoreCase() 一起使用,而不是使用 ilike cuz,這里的確切值是已知的。 ilike 有利於搜索模式或當我們不知道確切值時。 ignoreCase() 的唯一問題是,它不會將您的結果限制為小寫,並且還包括其他情況的結果,但我認為這是 hibernate 提供的唯一可用選項。
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.
您可以進一步將此列表添加到 Criteria 並對其進行處理。
您可以使用 Criterion.ilike。 有關更多信息,請查看此鏈接。
crit(Restrictions.eq("firstName", firstName).ignoreCase());
作品。
這確實返回了一個SimpleExpression Object
但它會生成lower(firstname)
查詢。 所以這行得通。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.