2013-03-05 138 views
4

比方說,我不得不解僱這樣的查詢:JPA非管理實體

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

使用本機查詢功能,如何最好地將其映射到泛型類?嘗試選擇新功能,但不知道...因此,任何幫助表示讚賞。

+0

什麼持久性提供您正在使用? Eclipselink有ResultType提示可能有助於http://www.eclipse.org/eclipselink/api/2.2/org/eclipse/persistence/config/ResultType.html – rootkit 2013-03-05 17:37:41

回答

3

由於您的審計日誌表共享相同的列,因此您可以創建一個「統一」這些表並將單個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替換爲您所需的值即可。

+0

否..auditlogs已經是視圖...如何映射到通用類使用本機查詢?...我想避免對象[]路徑 – user1224036 2013-03-05 17:04:34

+0

任何建議? – user1224036 2013-03-05 17:18:44

+0

謝謝,我會看看 – user1224036 2013-03-05 17:35:05

1

sql查詢中的別名會自動轉換爲大寫,並以大寫形式查找setter作爲結果org.hibernate.PropertyNotFoundException拋出異常。任何建議將不勝感激。

例如,下面的語句是尋找二傳手ID而不是D/I(找不到有關類數據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; 
    } 
} 
+1

使用「」爲我工作的大小寫敏感...我在以下鏈接中找到答案http://stackoverflow.com/questions/8136225/resulttransformer-with-createsqlquery-forces- no-camelcase-in-entity-fields – Minisha 2015-11-24 02:36:39

+0

我還有一個問題,在這行之後會發生什麼事情:entityManager.unwrap(Session.class)?會議是否會自動關閉,或者我們必須明確關閉會議? – Minisha 2015-11-24 08:56:51