簡體   English   中英

休眠標准集合的最新日期字段

[英]Hibernate Criteria most recent date field of Collection

我的實驗室有一組州,這是我的簡化班級:

    LabState {
        private Integer id;
        private State state;
        private Date date;
        private String comments;
    }

    State{
        private Integer id;
        private String name;

    }

    Lab{
        private Integer id;
        private List<LabState> states = new ArrayList<LabState>();
        private Date date;
        private String name
    }

我想通過休眠標准從特定實驗室獲得“最后狀態”。 在mySql中這項工作很好:

SELECT ls.* FROM labs_states les INNER JOIN
    ( SELECT idLab, idLabState, MAX(date) AS lastDate FROM labs_states GROUP BY idLab)
        groupedLabs ON les.idLab = groupedLabs.idLab  AND les.date = groupedLabs.lastDate

編輯:SearchMethod:

   public List<Labs> search(LabSearch labSearch) {

            SessionFactory sessionFactory = hibernateTemplate.getSessionFactory();
            Session session = sessionFactory.openSession();

            Criteria criteria = session.createCriteria(Lab.class);

            criteria.add(Restrictions.like("name", "%" + labSearch.getName() + "%"));

            if(labSearch.getState() != null){
                criteria.createCriteria("states").add(Restrictions.eq("state", labSearch.getState())).addOrder(Order.asc("date")).list().get(0);


            return (List<Lab>) criteria.list();
}

我不知道如何使用Criteria來執行此操作,或者是否還有其他方法可以執行此操作

謝謝

得到給定實驗室的最后狀態

Criteria criteria = session.createCriteria(Lab.class)
    .add(Restrictions.like("name", "%" + labSearch.getName() + "%"));
    .createAlias("states", "labstate")
    .createAlias("labstate", "state")
    .addOrder(Order.desc("date"))
    .setProjection(Projections.list()
        .add(Projections.property("labstate.id"), "id")
        .add(Projections.property("labstate.date"), "date")
        .add(Projections.property("labstate.comments"), "comments")
        .add(Projections.property("state.name"), "state"))
    .setResultTransformer(Transformers.aliasToBean<LabstateDto>())
    .setMaxResults(1);

return (List<LabstateDto>)criteria.list();

如果您希望多個實驗室返回最后一個狀態,則需要另一個查詢,因為它在db中而不是在類中具有從Labstate到Lab ony的向后引用,所以這並不是那么容易。

更新:根據您的評論,替代查詢

Criteria criteria = session.createCriteria(Lab.class, "lab")
    .add(Restrictions.like("name", "%" + labSearch.getName() + "%"));
    .createAlias("states", "labstate")
    .add(Subqueries.proptertyEq("labstate.Id", DetachedCriteria.for(Lab.class)
        .add(Restrictions.propertyEq("id", "lab.id"));
        .createAlias("states", "lstate")
        .createAlias("labstate.state", "state")
        .add(Restrictions.eq("name", state));
        .addOrder(Order.desc("labstate.date"))
        .setProjection(Projection.property("labstate.Id"))
        .setMaxResults(1)
     );

return (List<Lab>)criteria.list();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM