由于您的审计日志表共享相同的列,您可以创建一个“统一”这些表的视图并将单个 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`)
);
您可以根据需要轻松调整此示例,只需将 persons 和 MyResult 替换为您想要的即可。