0

我将用一个例子来解释这个问题。
我有一个 Vehicle 对象,它有一个型号名称和一个品牌。给出品牌时,应列出相关车辆。当同时给出品牌和型号时,应列出合适的车辆。

例如:有一个名为“Vehicle”的实体。它有一个名为 makeModel 的代理,其实体名称为MakeModel。MakeModel 的代理是“make”和“model”,其实体名称是 Model 和 Make。实体“Model”和“Make”都有字符串变量“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是休眠会话。

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 来获取所有车辆。

可以在此处找到相同的问题并参考问题。任何人都让我知道哪里出了问题以及如何根据给定的标准检索车辆清单。

4

1 回答 1

2

假设您要传递给您的函数makeValuemodelValue,它们是您想要的品牌和模型,您将拥有:

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>. 您可以将 a 添加@SuppressWarnings("unchecked")到您的方法中以避免看到未经检查的强制转换警告。

于 2012-05-08T07:38:05.330 回答