我将以一个例子来解释这个问题 我有一个Vehicle对象,它有一个模型名称和一个make。制作时,应列出相关车辆。当给出制造和模型时,应列出合适的车辆。
例如:
有一个名为'Vehicle'的实体。它有一个名为makeModel的代理,其实体名称为MakeModel
。 MakeModel的代理是'make'和'model',其实体名称是Model和Make.Both Entititiyes'Model'和'Make'有String变量'name'。这是类
class Vehicle{
private Integer vehicleId;
private MakeModel makeMOdel;
//getters and setters
}
class MakeModel {
private Make make;
private Model model;
//getters and setters
}
class Make{
private Integer mid;
private String make;
}
class Model{
private Integer mdlid;
private String modelName;
}
以下是我试图获取车辆清单的方法。这里,session
是Hibernate Session。
Criteria cr= session.createCriteria(Vehicle.class);
MakeModel mkmd=new MakeModel();
if( /* if only the make is give */){
Make mk=new Make();
mk.setMake("Toyota");
mkmd.setMake(mk);
}
else if(if both make and and model given){
Make mk=new Make();
mk.setMake("Toyota");
mkmd.setMake(mk);
Model md=new Model("Venus");
mkmd.setModel(md);
}
cr.createCriteria("makeModel").add(Example.create(mkmd));List l=cr.list();
但这会返回所有车辆。 我想让所有车辆都使用休眠标准,而不是HQL。
答案 0 :(得分:2)
假设您要传递给函数 makeValue 和 modelValue ,这些是您想要的品牌和型号,您将拥有:
Criteria cr = session.createCriteria(Vehicle.class); // Create the criteria on desired class
cr.createAlis("makeModel", "makeModel")
.createAlias("makeModel.make", "make")
.createAlias("makeModel.model", "model"); // Creating aliases makes a join on those tables
if (makeValue != null){
cr.add(Restrictions.eq("make.make", makeValue)) // If you have a makeValue passed, filter by it
}
if (makeModel != null){
cr.add(Restrictions.eq("model.modelName", modelValue)); // If you have a makeModel passed, filter by it
}
return cr.list(); // Return the list
结果将是List<Vehicle>
。您可以在方法中添加@SuppressWarnings("unchecked")
,以避免看到未经检查的投射警告。