【问题标题】:How to properly check if a row exist in database?如何正确检查数据库中是否存在行?
【发布时间】:2012-10-15 15:26:48
【问题描述】:

我的一个 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 正在控制台中生成其选择命令。当我在数据库的 SQL 控制台中检查此选择命令时,它会返回正确的值。那我做错了什么?

【问题讨论】:

    标签: java hibernate criteria


    【解决方案1】:

    看看this other questionuniqueResult 方法至少返回一个Number,然后试试这个:

    long rowCount = ((Number)cr.uniqueResult()).longValue();
    return (rowCount > 0) ? true : false;
    

    【讨论】:

    • 我也用这个检查过:Object rowCount = cr.uniqueResult();,问题还是一样。 Number 扩展了 Object,所以它应该可以工作,例外是相同的。
    • 那么你的实体的类型映射可能有错误。也有可能只有从您的查询返回的某些值(行)与您的映射类型不匹配。
    【解决方案2】:

    我的问题的解决方案非常棘手。上述方法中的参数code 是解决问题的关键。一开始我在 Hibernate 实体类中有与此参数对应的列,定义为具有 5 个符号长度的 varchar。与此同时,我不得不将其长度更改为只有 2 个标志。但是我调用的方法仍然是 5 个符号字符串长度。这就是我的错误发生的原因。我再次将 varchar 的长度更改为 5 个标志,此时一切都很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-31
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      相关资源
      最近更新 更多