2012-05-08 67 views
0

我会用一个例子来解释这个问题。
我有一个Vehicle对象,它有一个型号名称和一个品牌。制作时,应列出相关车辆。当制造商和型号都给出时,则应列出合适的车辆。休眠示例查询

例如: 有一个名为'Vehicle'的实体。它有一个名为makeModel的代理,其实体名称为MakeModel。 MakeModel有代理这是“化妆”和“模式”,其实体名称是型号和Make.Both Entititiyes“模式”和“制作”有字符串变量“name'.Here是类

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(); 

但是,这将返回所有车辆。 我想获得所有使用hibernate标准而不是HQL的车辆。

同样的问题可以找到here并且还提到this也。任何人都会告诉我哪里出了问题,以及如何根据给定的标准检索车辆列表。

+1

问题是?你引用的答案提供了一个很好的起点。你尝试了什么? “我无法解决问题”真的意味着什么? – home

+0

为此获取适当的休眠条件并不困难,但如果您可以为Vehicle和MakeModel实体提供代码,则会更容易。 –

+0

@家。感谢您的关注,并用所有代码编辑了问题。 –

回答

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>。您可以将@SuppressWarnings("unchecked")添加到您的方法中,以避免看到未检查的投射警告。

+0

标准正在返回一个车辆列表。我刚刚写了最后一条评论错误。 –

+0

它给了我很长时间的豁免堆栈跟踪。 :(。我不是专家,不清楚你的代码这一点'cr.createAlias(“makeModel”,“makeModel”) .createAlias(“make”,“make”)'设置别名'makeModel是好的,但'make'..因为没有make只有MakeModel有。 –

+0

你是对的。我编辑了我的上面的评论。看看吧。 –