[英]jpa non managed entities
假设我必须触发这样的查询:
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
个*_audit_logs
创建n
个类。
使用本机查询功能,我如何最好地将其映射到泛型类? 试图选择新功能,但不确定...因此任何帮助表示赞赏。
由于审计日志表共享相同的列,因此可以创建一个“统一”这些表并将单个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
替换为您想要的内容即可。
sql查询中的别名会自动转换为大写,并以大写形式查找setter作为结果org.hibernate.PropertyNotFoundException抛出异常。 任何建议将不胜感激。
例如,下面的语句是查找setter ID而不是Id / id(无法在类Data上找到ID的setter)
List<Data> result = entityManager.unwrap(Session.class)
.createSQLQuery("Select id as id from table")
.setParameter("day", date.getDayOfMonth())
.setParameter("month", date.getMonthOfYear())
.setParameter("year", date.getYear())
.setResultTransformer(Transformers.aliasToBean(Data.class))
.list();
class Data {
Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.