gpt4 book ai didi

java - 是否可以使 Hibernate 查询在多记录查询中跳过坏记录?

转载 作者:行者123 更新时间:2023-11-29 09:07:39 26 4
gpt4 key购买 nike

我有一个在其 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() 返回。
  • 保证数据库数据的清洁(如果这在我的能力范围内!)

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

最佳答案

不,在 Hibernate 中没有忽略这种静默错误。如何在 SQL/HQL 级别过滤此类记录?像这样的东西:

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

我知道 Hibernate 可以自动将这样的过滤器应用于每个查询。替代方法是使用(物化) View 。

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

关于java - 是否可以使 Hibernate 查询在多记录查询中跳过坏记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13998410/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com