Java 是否可以使Hibernate查询跳过多记录查询中的坏记录?
我有一个在其setters中进行验证的对象。例如: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
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中抛出异常,而是将对象标记为无效,然后将它们从
返回的列表中筛选出来,或者将验证保存为afterorg.hibernate.Query.List()
返回List()
- 保证数据库数据的清洁度(如果这在我的权限内!)
我的首选是允许对象继续从setter抛出异常,避免对Hibernate结果进行后处理,并避免为Hibernate实例化的对象引入新的验证生命周期步骤。有什么方法可以做到这一点吗?没有,在Hibernate中没有忽略这种无声错误。在SQL/HQL级别过滤这样的记录怎么样?比如:
...
WHERE name NOT LIKE "%*%"
我知道Hibernate可以对每个查询自动应用这样的过滤器。另一种方法是拥有一个(物化的)视图
当然,这种方法引入了一些重复(在
Employee
类中的一般规则必须与SQL中的规则精确匹配),但它似乎仍然是最干净的方法。即使这样做应该有效,但似乎是一种低效的解决方案。在查询到达之前在客户端进行验证会便宜得多。虽然这对提出的特定示例有效,但对象设置程序可能会有复杂的验证逻辑,而将其推入HQL子句是不可行的。设想一个setter正在对HQL中不支持的某些复杂数学函数的结果进行验证。