2014-06-18 36 views
1

我想創建一個包含我的數據庫不同類型的日誌對象的列表。我想建立一個列表,使得訂單最近被創建(每個表格中的日期創建字段)。什麼是從不同的表使用休眠和彈簧形成對象列表最好的方法

那麼通過獲取每個列表(4種不同的日誌),然後循環遍歷它們並通過比較它們並將它們放在新列表中,並且每次都獲得最新的列表,這樣做是唯一的方法嗎?這似乎可能需要很長時間,如果名單真的很長,他們可能會或可能不會。

有沒有更好的方法來做到這一點與Hibernate,我可以把所有的表放在一起,讓它爲我做的工作?這些表不共享任何密鑰或任何常規聯接?

任何建議將有所幫助。

contactLog 中的列(ID,MEMBERID,PHONENUMBER,電子郵件,地址,dateChanged)

salaryLog 中的列(ID,MEMBERID,工資,dateChanged)

relationsLog 中的列(ID,MEMBERID ,relationId,dateChanged)

personalInfoLog 具有列(ID,MEMBERID,身高,體重,眼睛顏色,hairColor的,dateChanged)

這些日誌的目的是爲了指示任何時候有人改變信息,我試圖爲用戶提供一個審計頁面,顯示對這些不同對象的所有更改。

回答

0

我建議使用UNION,但如果我沒有弄錯,HQL不支持UNION,所以你必須使用原生查詢和結果轉換器。這裏有一個例子:

 public class Log { 
     private Long id; 
     private Long memberId; 
     private String logType; 
     private Date dateChanged; 

     // getters & setters here 
    } 


    public class LogService { 

     @PersistenceContext 
     private EntityManager em; 

     public List<Log> getLogs(){ 
       final Session sess = em.unwrap(Session.class); 
       final SQLQuery query = session.createSQLQuery(
        "select id,memberId,'CONTACT' as logType, dateChanged from contactLog"+ 
        "union select id,memberId,'SALARY' as logType,dateChanged from salaryLog"+ 
        "union select id,memberId,'RELATIONS' as logType,dateChanged from relationsLog"+ 
        "union select id,memberId,'PERSONAL INFO' as logType,dateChanged from personalInfoLog "+ 
        "order by dateChanged desc"; 
       ); 

       query.setResultTransformer(Transformers.aliasToBean(Log.class)); 

       return query.list(); 
     } 
    } 

注意,只有共同的列選擇(因爲你必須從每個表使用UNION時選擇相同的列數)。

如果您想查看日誌的完整詳細信息,只需使用id加載特定日誌和日誌類型即可知道從哪個表中查找完整信息。

你可以修改查詢到Concat的所有更改的信息合併到一列的所有表(這意味着Log.class添加一個新的領域)。

 public class Log { 
     private Long id; 
     private Long memberId; 
     private String logType; 
     private Date dateChanged; 
     private String changedInfo; 
     // getters & setters here 
    } 
    "select id,memberId,'CONTACT' as logType, dateChanged, phonenumber||','||email||','||address as changedInfo from contactLog"+ 
        "union select id,memberId,'SALARY' as logType,dateChanged,salary as changedInfo from salaryLog"+ 
        "union select id,memberId,'RELATIONS' as logType,dateChanged,relationId as changedInfo from relationsLog"+ 
        "union select id,memberId,'PERSONAL INFO' as logType,dateChanged, height||','|| weight||','|| eyeColor||','|| hairColor as changedInfo from personalInfoLog "+ 
        "order by dateChanged desc 
0

另一種方法是在數據庫上創建一個視圖,並像往常一樣使用spring和hibernate。

+0

比回答更多評論... – hd1