jpa非管理实体

时间:2013-03-05 16:54:54

标签: java jpa orm audit-logging

假设我必须触发这样的查询:

Select primarykey, columnname, old_value, new_value from first_audit_log;

Select primarykey, columnname, old_value, new_value from second_audit_log;

Select primarykey, columnname, old_value, new_value from third_audit_log; ...so on

audit_log未作为JPA enity映射到任何类,我严格无法为nn创建*_audit_logs个类。

使用本机查询功能,我如何才能将其映射到泛型类?试图选择新功能,但不确定...因此,任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:4)

由于审计日志表共享相同的列,因此您可以创建一个“统一”这些表并将单个Java类映射到该视图的视图。我相信你可以,因为你不需要写更新,我想。

作为替代方案,使用本机查询将是一个不错的选择。

修改

1)如果你的审计日志的的意见,您可以根据其他视图创建视图,如果你不希望创建一个映射Java类为他们每个人。不过,别忘了添加具有价值1如果行来自于“第一”审计日志,2如果它来自第二个,依此类推虚拟列,这样你就可以区分。

2)为了使用本机查询,假设您的持久性提供程序是Hibernate,您可以在此示例中执行以下操作:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
EntityManager em = emf.createEntityManager();

Session sess = em.unwrap(Session.class); // <-- Use Hibernate-specific features
SQLQuery query = sess.createSQLQuery(
   "SELECT AVG(age) AS averageAge, AVG(salary) as averageSalary FROM persons");

query.setResultTransformer(Transformers.aliasToBean(MyResult.class));
MyResult result = (MyResult) query.list().get(0);

其中MyResult声明如下:

public class MyResult {

    private BigDecimal averageAge;
    private BigDecimal averageSalary;

    public BigDecimal getAverageAge() {
        return averageAge;
    }
    public void setAverageAge(BigDecimal averageAge) {
        this.averageAge = averageAge;
    }
    public BigDecimal getAverageSalary() {
        return averageSalary;
    }
    public void setAverageSalary(BigDecimal averageSalary) {
        this.averageSalary = averageSalary;
    }

}

persons表是这样的(MySQL语法):

CREATE TABLE `persons` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(255) NOT NULL,
  `lastname` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  `salary` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);

您可以根据自己的需要轻松调整此示例,只需将personsMyResult替换为您想要的内容。