![](/img/trans.png)
[英]Hibernate Criteria: counting the most recent entries, grouped per attribute
[英]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.