【问题标题】:Spring, Hibernate : Retrieve Objects based upon date, if not found, nearest dateSpring,Hibernate:根据日期检索对象,如果未找到,则为最近的日期
【发布时间】:2016-03-11 12:27:49
【问题描述】:

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

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

现在,问题是:

  1. 如果对象在第 3、4、5 天没有修改,而是直接在第 6 天和第 7 天修改,一旦完成,如果用户尝试从第 3 天检索对象,它没有被修改怎么办,但它是在 6 日,所以我如何实现这个逻辑,我必须检索下一个最好的。
  2. 我面临的另一个问题是,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
    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();
    }

模型组注释:

@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();
    }

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

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

【问题讨论】:

    标签: java spring hibernate date spring-mvc


    【解决方案1】:

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

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

    This 问题应该是一个帮助。

    【讨论】:

    • 我不认为这会有所帮助,因为我也可以使用 Hibernate 限制行数...当我从 GroupSection 检索数据时,我得到了所有符合条件的关联 Note 对象,而不仅仅是一个。
    猜你喜欢
    • 2013-08-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 2020-07-26
    • 2013-05-08
    相关资源
    最近更新 更多