问题描述
假设我必须触发这样的查询:
Let's say I have to fire a query like this:
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到任何类,我严格不能创建 n
n
的数量 * _ audit_logs
。
audit_log
is not mapped as JPA enity to any class and I strictly can't create n
number of classes for n
number of *_audit_logs
.
使用本机查询功能,我如何才能将其映射到泛型类?尝试选择新功能,但不确定...因此,任何帮助都表示赞赏。
Using native query feature, how best I can map this to a generic class? Trying to SELECT NEW feature, but not sure... Hence any help is appreciated.
推荐答案
由于审计日志表共享在相同的列中,您可以创建一个统一这些表并将单个Java类映射到该视图的视图。我相信你可以,因为你不需要写更新,我想。
Since your audit logs tables share the same columns, you can create a view that "unifies" those tables and map a single Java class to that view. I believe you can, since you don't need to write updates, I guess.
作为替代方案,使用本机查询将是一个不错的选择。
As an alternative, using native queries would be a good choice.
编辑:
1)如果审核日志已经如果您不想为每个视图创建映射Java类,则可以基于其他视图创建视图。只记得添加一个值为 1
的虚拟列,如果该行来自第一个审核日志, 2
如果它来自第二个,依此类推,那么你可以将它们分开。
1) If your audit logs are already views, you can create a view based on other views, if you don't want to create a mapping Java class for each of them. Just remember to add a dummy column that has value 1
if the row comes from the "first" audit log, 2
if it comes from the second, and so on, so you can set them apart.
2)为了使用本机查询,假设您的持久性提供程序是Hibernate,那么可以这样做:
2) In order to use native queries, assuming your persistence provider is Hibernate, you can do like in this example:
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;
}
}
和人
表是这样的(MySQL语法):
and the persons
table is like this (MySQL syntax):
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`)
);
您可以根据需要轻松调整此示例,只需替换人您想要的是code>和
MyResult
。
You can easily adapt this example to your needs, just replace persons
and MyResult
with what you want.
这篇关于jpa非管理实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!