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

Java Spring,Hibernate:根据日期检索对象,如果找不到,则检索最近的日期,java,spring,hibernate,date,spring-mvc,Java,Spring,Hibernate,Date,Spring Mvc,我正在从事一个SpringMVC项目,在这个项目中,我每天晚上都在创建GroupNote对象的备份。在创建备份之前,我正在检查指示对象已修改的布尔标志是否为真。如果是,则仅创建备份,并且在创建对象时已设置日期。 现在,当创建重复的GroupNote对象时,它设置了最新的日期 这样,用户可以选择一个特定的日期,然后检索当天的数据集 现在,问题是: 如果对象在第3、4、5天没有修改,而是在第6天直接修改,然后在第7天修改,一旦修改完成,如果用户尝试从第3天检索对象,它没有修改,但在第6天,那么我如何

我正在从事一个SpringMVC项目,在这个项目中,我每天晚上都在创建GroupNote对象的备份。在创建备份之前,我正在检查指示
对象
已修改的
布尔
标志是否为
。如果是,则仅创建备份,并且在创建对象时已设置日期。 现在,当创建重复的GroupNote对象时,它设置了最新的日期

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

现在,问题是:

  • 如果对象在第3、4、5天没有修改,而是在第6天直接修改,然后在第7天修改,一旦修改完成,如果用户尝试从第3天检索对象,它没有修改,但在第6天,那么我如何实现这个逻辑,我必须检索下一个最好的。
  • 我面临的另一个问题是,GroupNotes与GroupSection之间存在多对一映射如何检索给定日期的给定GroupSection的所有GroupNote对象,它不会提供第3天之后的所有实体,但只提供第6天的实体。
  • 以下是我每天晚上如何创建副本:

      @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());
            }
        }
    
    有问题的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();
        }
    
    @覆盖
    @事务(只读=真)
    公共列表listGroupNotesBySectionAndDate(int sectionId,Date-dateToLoad){
    会话会话=this.sessionFactory.getCurrentSession();
    org.hibernate.Query Query=session.createQuery(“从GroupNotes作为n,其中n.ownednotes.msectionid=:msectionid和((n.noteDisabled=false和n.noteInActive=false)”
    +“和n.privateNoteUser为null,n.noteSavedDate>:dateToLoad)由n.noteSavedDate asc进行排序”);
    setParameter(“msectionid”,sectionId);
    setParameter(“dateToLoad”,dateToLoad);
    返回query.list();
    }
    
    正如您在上面的方法中所看到的,我无法将查询限制为仅在特定日期找到的对象,我有一个comparator操作符,它将给出指定日期之后/之前的任何日期的数据


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

    据我所知,您的dao方法非常好,但您只想得到最好的结果(日期最近),而不是整个列表,对吗

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


    问题应该是有帮助的。

    据我所知,您的dao方法非常好,但您只想得到最好的结果(具有最接近的日期),而不是整个列表,对吗

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


    这个问题应该是有帮助的。

    我认为这不会有帮助,因为我可以用Hibernate限制行数。。。当我从GroupSection检索数据时,我得到的是符合条件的所有相关Notes对象,而不仅仅是一个。我认为这不会有帮助,因为我还可以使用Hibernate限制行数。。。当我从GroupSection检索数据时,我得到的是符合条件的所有相关Notes对象,而不仅仅是一个。
    @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;
    }
    
      @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();
        }