[英]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.