我的一个DAO方法包含以下方法:
@Override
public boolean isAvailable(String code) {
Criteria criteria = getSession().createCriteria(MyEntity.class);
cr.add(Restrictions.eq("code", code).ignoreCase());
cr.setProjection(Projections.rowCount());
Long rowCount = (Long) cr.uniqueResult();
return (rowCount > 0) ? true : false;
}
在最后一行抛出以下异常:
org.hibernate.exception.DataException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:102)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.doList(Loader.java:2452)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2192)
at org.hibernate.loader.Loader.list(Loader.java:2187)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1706)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
at org.hibernate.impl.CriteriaImpl.uniqueResult(CriteriaImpl.java:369)
code
是此表中的主键。 Hibernate在控制台中生成其select命令。当我在我的数据库中的SQL控制台中检查此select命令时,它返回正确的值。那么我做错了什么?
答案 0 :(得分:1)
看看this other question。
方法uniqueResult
至少返回Number
,然后尝试:
long rowCount = ((Number)cr.uniqueResult()).longValue();
return (rowCount > 0) ? true : false;
答案 1 :(得分:0)
解决我的问题非常棘手。我上面讨论的方法中的参数code
是解决方案的关键。在开始时,我在Hibernate实体类中有与此参数对应的列,定义为具有5个符号长度的varchar。与此同时,我不得不将其长度改为仅2个标志。但是我仍然用5个符号字符串长度调用该方法。这就是我的错误发生的原因。我已经将varchar的长度再次更改为5个符号,此刻一切正常。