[英]Hibernate Criteria like on numeric field
在数字字段的条件上添加LIKE时遇到错误
码:
criteria.add(Restrictions.like("id", value, MatchMode.ANYWHERE));
在控制台上输出:
Hibernate: select this_.id as id0_0_, this_.firstName as firstName0_0_ from Employee this_ where this_.id like ?
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long
注意:已经尝试过sqlRestrictions
,这里我使用id字段,但是在我的方案中,用户选择搜索字段,因此很难为用户选择的字段获取SQL字段。 使用基于注释的hibernate()参见以下函数。
public static Criteria addSearch(Criteria criteria, String field, String value){
criteria.add(Restrictions.like(field, value, MatchMode.ANYWHERE));
return criteria;
}
完整的Stacktrace:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long
at org.hibernate.type.descriptor.java.LongTypeDescriptor.unwrap(LongTypeDescriptor.java:36)
at org.hibernate.type.descriptor.sql.BigIntTypeDescriptor$1.doBind(BigIntTypeDescriptor.java:52)
at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:91)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:283)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:278)
at org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1873)
at org.hibernate.loader.Loader.bindParameterValues(Loader.java:1844)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1716)
at org.hibernate.loader.Loader.doQuery(Loader.java:801)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
at org.hibernate.loader.Loader.doList(Loader.java:2533)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
at org.hibernate.loader.Loader.list(Loader.java:2271)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1716)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
at exec.Main.main(Main.java:68)
从异常日志来看,这似乎是强制转换问题。 您是否尝试过String valueStr = String.valueOf(value);
(假设变量值为long类型)?
对于LIKE
操作,您将需要在字符串"%".concat(valueStr).concat("%")
添加'%'符号,
Restriction.like() is causing casting problem. You can use criteria to build a sqlRestriction for the same
criteria.add(Restrictions
.sqlRestriction("{alias}.id LIKE ('%value%')"));
这对我有用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.