【问题标题】:Hibernate method to only return records where the value in a specify column has changedHibernate 方法仅返回指定列中的值已更改的记录
【发布时间】:2012-02-24 04:05:08
【问题描述】:

表:Profile

pk   fk fname lname  dob         ssn        createDate  ModifyDate
1    22 bob   smith  01/02/1978  123456789  01/27/2012  null
2    22 bob   smith  01/02/1978  987654321  01/27/2012  01/28/2012
3    22 bob   smith  04/02/1944  123456789  01/27/2012  01/29/2012
4    22 bob   dole   04/02/1944  123456789  01/27/2012  01/30/2012
5    22 bob   dole   02/12/1913  123456789  01/27/2012  01/31/2012
6    22 john  dole   02/12/1913  123456789  01/27/2012  02/02/2012
7    22 bob   dole   11/22/1994  123456789  01/27/2012  02/03/2012

我想返回最近三次 dob 更改为 fk = 22

所以这将返回记录 7、6、4。

所以我可以这样做:

Integer foreignKey = new Integer(22);
Criteria criteria = session.createCriteria(Profile.class);
List results = criteria.add(Restrictions.eq("fk",foreignKey))
  .addOrder( Order.desc("ModifyDate") ).list();

现在我知道我可以编写一个 for 循环并比较 dob 以查看哪些日期已更改。

但是有没有一种休眠方法或更简单的方法来做到这一点?

如果我想看看dobfname 是否都改变了呢?

谢谢。

【问题讨论】:

  • 欢迎来到 SO。请不要在这里转储控制台输出。尝试格式化您的表格,以便很好地显示。
  • 你怎么知道dob改变了
  • @Tichodroma 我实际上在写字板中输入了这个,然后尝试使用 html 但它没有用。所以下次我会尝试更好地格式化它。感谢您的欢迎。
  • 你可以用空格来缩进所有代码。不需要 HTML 标记。
  • @Tichodroma 我想这就是问题所在。一些背景。有一个配置文件表,只要表中的任何属性发生更改,触发器就会在另一个表中创建历史记录。所以上面是历史表。我只需要检索最近 3 次 dob 更改。所以我认为这样做的唯一方法是比较每个记录的 dob 属性,看看是否有变化。所以我问有没有更简单的方法?我可以设置一些休眠属性或可以使用的方法?

标签: java sql database hibernate criteria


【解决方案1】:

您可能想看看Hibernate Envers,但我认为您不能用它自动执行此类查询。 Afaik 你只有两种可能性来实现这一点:

  1. 创建适当的查询(条件、HQL、SQL)来检索相应的记录或加载整个历史记录并识别 Java 代码中的记录。
  2. 扩展您的历史记录表和触发器(或休眠事件侦听器)以包含更改的属性/列的名称。也许每个属性/列都有一个额外的布尔列。这样您就可以非常高效地查询相应的记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多