0

例を挙げて問題を説明します。
モデル名とメーカーを持つ Vehicle オブジェクトがあります。メーカーが指定されている場合は、関連する車両をリストする必要があります。メーカーとモデルの両方が指定されている場合は、適切な車両をリストする必要があります。

例: 'Vehicle' というエンティティがあり、エンティティ名が である makeModel というプロキシがありMakeModelます。MakeModel には、エンティティ名が Model および Make である「make」および「model」のプロキシがあります。両方のエンティティ「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;
}

車両リストを取得しようとした方法は次のとおりです。これがHibernate sessionSession です。

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

しかし、これはすべての vehicle を返します。HQL ではなく、休止状態の基準を使用してすべての車両を取得したいと考えています。

同じ質問がここにあり、これも参照できます。どこが間違っているのか、特定の基準に従って車両リストを取得する方法を教えてください。

4

1 に答える 1

2

関数makeValuemodelValueに渡すと仮定すると、これらは必要な make とモデルであり、次のようになります。

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 に答える