首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >In-Criterion的Ignorecase

In-Criterion的Ignorecase
EN

Stack Overflow用户
提问于 2012-07-18 21:47:17
回答 4查看 6.2K关注 0票数 4

我想用带有Hibernate Criteria API的In-Criteria来选择不区分大小写的项目。例如。

代码语言:javascript
复制
Criteria crit = session.createCriteria(Item.class);
crit.add(Restrictions.in("prop", valueList).ignoreCase());

不幸的是,Criterion类没有ignoreCase方法。HQL不是一种替代方案。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-18 22:27:32

获取Restrictions.in() (InExpression)返回的Criterion类的源代码,创建另一个类似的类,但将值列表中的所有元素转换为小写,并生成如下SQL查询:

代码语言:javascript
复制
lower(prop) in (...)
票数 5
EN

Stack Overflow用户

发布于 2012-07-18 23:29:38

我实现了自己的InExpression,它忽略了大小写。它与hibernate-core-3.6.10中的InExpresion几乎相同。唯一的区别是“较低的(..)”。

代码语言:javascript
复制
import java.util.ArrayList;
import org.hibernate.Criteria;
import org.hibernate.EntityMode;
import org.hibernate.HibernateException;
import org.hibernate.criterion.CriteriaQuery;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.InExpression;
import org.hibernate.engine.TypedValue;
import org.hibernate.type.CompositeType;
import org.hibernate.type.Type;
import org.hibernate.util.StringHelper;

public class InExpressionIgnoringCase implements Criterion {

private final String propertyName;
private final Object[] values;

public InExpressionIgnoringCase(final String propertyName, final Object[] values) {
    this.propertyName = propertyName;
    this.values = values;
}

public String toSqlString(final Criteria criteria, final CriteriaQuery criteriaQuery) throws HibernateException {
    final String[] columns = criteriaQuery.findColumns(this.propertyName, criteria);
    final String[] wrappedLowerColumns = wrapLower(columns);
    if (criteriaQuery.getFactory().getDialect().supportsRowValueConstructorSyntaxInInList() || columns.length <= 1) {

        String singleValueParam = StringHelper.repeat("lower(?), ", columns.length - 1) + "lower(?)";
        if (columns.length > 1)
            singleValueParam = '(' + singleValueParam + ')';
        final String params = this.values.length > 0 ? StringHelper.repeat(singleValueParam + ", ",
                this.values.length - 1) + singleValueParam : "";
        String cols = StringHelper.join(", ", wrappedLowerColumns);
        if (columns.length > 1)
            cols = '(' + cols + ')';
        return cols + " in (" + params + ')';
    } else {
        String cols = " ( " + StringHelper.join(" = lower(?) and ", wrappedLowerColumns) + "= lower(?) ) ";
        cols = this.values.length > 0 ? StringHelper.repeat(cols + "or ", this.values.length - 1) + cols : "";
        cols = " ( " + cols + " ) ";
        return cols;
    }
}

public TypedValue[] getTypedValues(final Criteria criteria, final CriteriaQuery criteriaQuery)
        throws HibernateException {
    final ArrayList<TypedValue> list = new ArrayList<TypedValue>();
    final Type type = criteriaQuery.getTypeUsingProjection(criteria, this.propertyName);
    if (type.isComponentType()) {
        final CompositeType actype = (CompositeType) type;
        final Type[] types = actype.getSubtypes();
        for (int j = 0; j < this.values.length; j++) {
            for (int i = 0; i < types.length; i++) {
                final Object subval = this.values[j] == null ? null : actype.getPropertyValues(this.values[j],
                        EntityMode.POJO)[i];
                list.add(new TypedValue(types[i], subval, EntityMode.POJO));
            }
        }
    } else {
        for (int j = 0; j < this.values.length; j++) {
            list.add(new TypedValue(type, this.values[j], EntityMode.POJO));
        }
    }
    return list.toArray(new TypedValue[list.size()]);
}

@Override
public String toString() {
    return this.propertyName + " in (" + StringHelper.toString(this.values) + ')';
}

private String[] wrapLower(final String[] columns) {
    final String[] wrappedColumns = new String[columns.length];
    for (int i = 0; i < columns.length; i++) {
        wrappedColumns[i] = "lower(" + columns[i] + ")";
    }
    return wrappedColumns;
}
}

用法:

代码语言:javascript
复制
final Criteria crit = session.createCriteria(Item.class);
            crit.add(new InExpressionIgnoringCase("prop", array));
票数 4
EN

Stack Overflow用户

发布于 2015-01-20 00:01:33

另一种方法是使用sqlRestriction。因此,您将值转换为逗号分隔的小写字符串,然后调用。

代码语言:javascript
复制
crit.add(Restrictions.sqlRestriction("lower({alias}.prop) in ( " + q + " )"));

但是,您的查询参数必须进行清理。

您也可以使用disjunction

代码语言:javascript
复制
Junction j = Restrictions.disjunction();
for (String prop: props) {
    j.add(Restrictions.eq("prop", prop).ignoreCase());
}
crit.add(j);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11542902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档