Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以使Hibernate查询跳过多记录查询中的坏记录?_Java_Hibernate - Fatal编程技术网

Java 是否可以使Hibernate查询跳过多记录查询中的坏记录?

Java 是否可以使Hibernate查询跳过多记录查询中的坏记录?,java,hibernate,Java,Hibernate,我有一个在其setters中进行验证的对象。例如: 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 = theNa

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

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*”的
员工
)时,
IllegalArgumentException
会导致整个查询失败。对于这个特定的应用程序(加载缓存),Hibernate的理想行为是捕获异常、拒绝记录,并返回在初始化期间未引发任何异常的对象列表

我知道有许多替代解决方案:

  • 使用设置休眠,绕过设置程序
  • 不要在setter中抛出异常,而是将对象标记为无效,然后将它们从
    org.hibernate.Query.List()
    返回的列表中筛选出来,或者将验证保存为after
    List()
    返回
  • 保证数据库数据的清洁度(如果这在我的权限内!)

我的首选是允许对象继续从setter抛出异常,避免对Hibernate结果进行后处理,并避免为Hibernate实例化的对象引入新的验证生命周期步骤。有什么方法可以做到这一点吗?

没有,在Hibernate中没有忽略这种无声错误。在SQL/HQL级别过滤这样的记录怎么样?比如:

...
WHERE name NOT LIKE "%*%"
我知道Hibernate可以对每个查询自动应用这样的过滤器。另一种方法是拥有一个(物化的)视图


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

即使这样做应该有效,但似乎是一种低效的解决方案。在查询到达之前在客户端进行验证会便宜得多。虽然这对提出的特定示例有效,但对象设置程序可能会有复杂的验证逻辑,而将其推入HQL子句是不可行的。设想一个setter正在对HQL中不支持的某些复杂数学函数的结果进行验证。