是否有可能使Hibernate查询跳过多记录查询中的错误记录?

时间:2012-12-21 23:16:13

标签: java hibernate

我有一个在其setter中进行验证的对象。例如:

class Employee {
   private String name;
   public void setName(String theName) {
     if (theName.contains("*")) {
       throw new IllegalArgumentException("You can't have an asterisk in a name!");
     }
     name = theName
   }
}

当Hibernate查询尝试使用无效数据(例如名为“John Smith *”的Employee)实例化对象时,IllegalArgumentException会导致整个查询失败。对于这个特定的应用程序 - 加载缓存 - 理想的行为是Hibernate捕获异常,拒绝记录,并返回在初始化期间没有抛出任何异常的对象列表。

我知道许多其他解决方案:

  • 使用direct field access设置Hibernate,绕过setter
  • 不是在setter中抛出异常,而是将对象标记为无效,然后将其从org.hibernate.Query.list()返回的List中过滤掉,或者在list()返回后保存验证。
  • 保证数据库数据的清洁(如果这只是我的力量!)

我的偏好是允许对象继续从setter中抛出异常,并避免对Hibernate结果进行后处理,并避免为Hibernate实例化的对象引入新的验证生命周期步骤。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

不,在Hibernate中没有忽略这样的静默错误。那么在SQL / HQL级别过滤这些记录呢?类似的东西:

...
WHERE name NOT LIKE "%*%"

我知道Hibernate可以自动将这种过滤器应用于每个查询。替代方法是拥有(物化)视图。

当然这种方法引入了一些重复(在Employee类中的一般规则必须与SQL中的那些完全匹配),但它似乎仍然是最干净的方式。