簡體   English   中英

不區分大小寫的等於使用 Hibernate 標准

[英]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()方法。 為此,我們必須將ilikeMatchMode一起使用。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM