Spring,Hibernate:根据日期检索对象,如果找不到,最近的日期

时间:2016-03-11 12:27:50

标签: java spring hibernate date spring-mvc

我正在开发一个Spring-MVC项目,我每天晚上都在创建GroupNote对象的备份。在创建备份之前,我正在检查指示boolean被修改的object标记是否为true。如果是,则仅创建备份,并且在创建对象时已设置日期。 现在,当创建重复的GroupNote对象时,它具有最新的日期设置。

这样,用户可以选择特定日期,然后检索当天的数据集。

现在,问题是:

  1. 如果在第3,4,5天没有修改对象,而是直接在第6天,然后在第7天,那么一旦完成,如果用户尝试从第3天检索对象,那么它就不会被修改,但它是在6日,所以我如何实现这个逻辑,我必须找到下一个最好的逻辑。
  2. 我面临的另一个问题是,GroupNotes与GroupSection有多对一的映射。 如何为给定日期检索给定GroupSection的所有GroupNote对象,该日期不会给出第3天之后但只有第6个之后的所有实体。
  3. 以下是我每晚创建重复项的方式:

      @Override
        public void  retrieveModifiedNotes() {
            List<GroupNotes> groupNotesList = this.groupNotesDAO.listModifiedNotesForYesterday();
            for(GroupNotes yesterdayNotes : groupNotesList){
                yesterdayNotes.setLatestNote(false);
                this.groupNotesDAO.editGroupNote(yesterdayNotes,yesterdayNotes.getOwnedSectionId());
                GroupNotes newDayNotes = new GroupNotes();
                BeanUtils.copyProperties(yesterdayNotes, newDayNotes);
                newDayNotes.setLatestNote(true);
                newDayNotes.setMnoticesid(0);
                newDayNotes.setGroupNoteHistorySet(yesterdayNotes.getGroupNoteHistorySet());
                newDayNotes.setNoteActivitySet(yesterdayNotes.getNoteActivitySet());
                newDayNotes.setNoteSelectionSet(yesterdayNotes.getNoteSelectionSet());
                newDayNotes.setUnreadNotesSet(null);
                newDayNotes.setPrimaryNote(yesterdayNotes);
                this.groupNotesDAO.addGroupNote(newDayNotes,yesterdayNotes.getOwnedSectionId());
            }
        }
    

    让我来修改笔记:

    @Override
        public List<GroupNotes> listModifiedNotesForYesterday() {
            Session session = this.sessionFactory.getCurrentSession();
            Calendar cal = Calendar.getInstance(); // Todays date
            Query query = session.createQuery("from GroupNotes as gs where gs.noteModified=true and gs.latestNote=true and " +
                    "gs.noteSavedDate<:loadDate");
            query.setParameter("loadDate", cal.gethodtTime());
            return query.list();
        }
    

    Model GroupNotes:

    @Entity
    @Table(name = "groupnotes")
    public class GroupNotes implements Serializable {
    
    
        @Column(name = "note_modified", columnDefinition = "boolean default false")
        private boolean noteModified;
    
      @Column(name = "latest_note", columnDefinition = "boolean default true")
        private boolean latestNote;
    
        @Column(name = "note_save_date", columnDefinition = "date")
        private Date noteSavedDate;
    
    
        @ManyToOne
        @JoinColumn(name = "msectionid")
        @JsonIgnore
        private GroupSection ownednotes;
    }
    

    有问题的DAO方法:

      @Override
        @Transactional(readOnly = true)
        public List<GroupNotes> listGroupNotesBySectionAndDate(int sectionId, Date dateToLoad) {
            Session session = this.sessionFactory.getCurrentSession();
            org.hibernate.Query query = session.createQuery("From GroupNotes as n where n.ownednotes.msectionid=:msectionid and ((n.noteDisabled=false and n.noteInActive=false "
                    + "and n.privateNoteUser is null and n.noteSavedDate>:dateToLoad)) order by n.noteSavedDate asc");
            query.setParameter("msectionid", sectionId);
            query.setParameter("dateToLoad", dateToLoad);
            return query.list();
        }
    

    正如您在上面的方法中所看到的,我无法将查询限制为仅在特定日期找到的对象,我有一个比较运算符,它将为指定的日期之前/之前的任何日期提供数据。

    我希望问题很清楚,如果有任何疑问,请告诉我。谢谢。 : - )

1 个答案:

答案 0 :(得分:0)

据我了解你的问题,你的dao方法非常好,但你想得到的结果最好(最接近的日期)不是整个列表,对吗?

在这种情况下,你应该使用jpa hibernate的分页机制将查询结果限制为只有一行。

This问题应该是一个帮助。