Java Hibernate条件集合的最近日期字段
我有一系列州的实验室,以下是我的简化课程:Java Hibernate条件集合的最近日期字段,java,spring,hibernate,hibernate-criteria,Java,Spring,Hibernate,Hibernate Criteria,我有一系列州的实验室,以下是我的简化课程: LabState { private Integer id; private State state; private Date date; private String comments; } State{ private Integer id; private String name; } Lab{
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
}
编辑:搜索方法:
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();
}
公共列表搜索(LabSearch LabSearch){
SessionFactory SessionFactory=hibernateTemplate.getSessionFactory();
Session Session=sessionFactory.openSession();
条件=session.createCriteria(Lab.class);
criteria.add(限制,如(“name”、“%”+labSearch.getName()+“%”);
if(labSearch.getState()!=null){
criteria.createCriteria(“states”).add(Restrictions.eq(“state”,labSearch.getState()).addOrder(Order.asc(“date”))).list().get(0);
返回(列表)条件。列表();
}
我不知道如何使用标准来实现这一点,或者是否有其他方法来实现
感谢获取给定实验室的最后状态
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();
Criteria=session.createCriteria(Lab.class)
.add(限制,如“name”、“%”+labSearch.getName()+“%”);
.createAlias(“状态”、“labstate”)
.createAlias(“labstate”、“state”)
.addOrder(Order.desc(“日期”))
.setProjection(projects.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())
.setMaxResults(1);
返回(列表)条件。列表();
如果您希望返回多个lab的最后一个状态,那么您需要另一个查询,这并不容易,因为您在db中而不是在类中有从Labstate到Labony的反向引用
更新:作为对您的评论的回应,可选择一个查询
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();
Criteria=session.createCriteria(Lab.class,“Lab”)
.add(限制,如“name”、“%”+labSearch.getName()+“%”);
.createAlias(“状态”、“labstate”)
.add(subquerys.proptertyEq(“labstate.Id”),DetachedCriteria.for(Lab.class)
.添加(限制。属性yq(“id”、“实验室id”));
.createAlias(“州”、“州”)
.createAlias(“labstate.state”、“state”)
.添加(限制条件、情商(“名称”、状态));
.addOrder(Order.desc(“labstate.date”))
.setProjection(Projection.property(“labstate.Id”))
.setMaxResults(1)
);
返回(列表)条件。列表();
获取给定实验室的最后状态
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();
Criteria=session.createCriteria(Lab.class)
.add(限制,如“name”、“%”+labSearch.getName()+“%”);
.createAlias(“状态”、“labstate”)
.createAlias(“labstate”、“state”)
.addOrder(Order.desc(“日期”))
.setProjection(projects.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())
.setMaxResults(1);
返回(列表)条件。列表();
如果您希望返回多个lab的最后一个状态,那么您需要另一个查询,这并不容易,因为您在db中而不是在类中有从Labstate到Labony的反向引用
更新:作为对您的评论的回应,可选择一个查询
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();
Criteria=session.createCriteria(Lab.class,“Lab”)
.add(限制,如“name”、“%”+labSearch.getName()+“%”);
.createAlias(“状态”、“labstate”)
.add(subquerys.proptertyEq(“labstate.Id”),DetachedCriteria.for(Lab.class)
.添加(限制。属性yq(“id”、“实验室id”));
.createAlias(“州”、“州”)
.createAlias(“labstate.state”、“state”)
.添加(限制条件、情商(“名称”、状态));
.addOrder(Order.desc(“labstate.date”))
.setProjection(Projection.property(“labstate.Id”))
.setMaxResults(1)
);
返回(列表)条件。列表();
谢谢,但正如您所提到的,我需要所有具有特定状态的实验室。我使用本机SQL解决了问题,然后将其添加到实体实验室,我不知道这是否是最佳的。您需要最后一个,完整的实验室状态还是只需要状态对象的名称?我需要一个符合搜索条件的实验室列表,然后我可以得到t他用Lab.getState()陈述。但是如果我按状态进行搜索,我只需要在每个实验室的当前状态下进行搜索。谢谢,但正如您所提到的,我需要所有具有特定状态的实验室。我使用本机SQL解决了问题,然后将其添加到实体实验室,我不知道这是否是最佳的。您需要最后一个,完整的实验室状态还是仅需要名称我需要一个符合搜索条件的实验室列表,然后我可以使用Lab.getState()获取状态。但是如果我按状态进行搜索,我只需要在每个实验室的当前状态下进行搜索。