什么是使用Hibernate和spring形成来自不同表的对象列表的最佳方法

时间:2014-06-18 19:10:41

标签: java spring hibernate spring-mvc

我正在尝试创建一个包含不同类型日志的对象列表。我想建立一个列表,使得订单是最近制作的(每个表中的日期创建字段)。

通过获取每个列表(4种不同类型的日志)然后循环浏览它们并通过比较它们并每次获取最新的列表将它们放入新列表中是唯一的方法吗?这似乎可能需要很长时间,如果列表真的很长,他们可能会或可能不会。

有没有更好的方法来使用Hibernate,我可以将所有表放在一起并让它为我工作?这些表格不能共享正常加入的任何键或任何内容吗?

任何建议都会有所帮助。

contactLog 有列(Id,memberId,phonenumber,email,address,dateChanged)

salaryLog 有列(Id,memberId,salary,dateChanged)

relationsLog 有列(Id,memberId,relationId,dateChanged)

personalInfoLog 有列(Id,memberId,height,weight,eyeColor,hairColor,dateChanged)

这些日志的目的是指示任何人随时更改信息,并且我试图向用户提供一个审核页面,该页面将显示对这些不同对象的所有更改。

2 个答案:

答案 0 :(得分: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加载特定日志和日志类型,以便知道从哪个表中查找完整信息。

您可以修改查询以将所有已更改的信息连接到所有表的一列(这意味着在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

答案 1 :(得分:0)

另一个approch将是在您的数据库上创建一个视图,并像往常一样使用spring和hibernate。