如何正确检查数据库中是否存在行?

时间:2012-10-25 12:33:59

标签: java hibernate criteria

我的一个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命令时,它返回正确的值。那么我做错了什么?

2 个答案:

答案 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个符号,此刻一切正常。