2012-05-08 5 views
0

この例で問題を説明します。
私はモデル名とメイクを持つVehicleオブジェクトを持っています。メイクが与えられたら、関連する車両をリストアップする必要があります。 makeとmodelの両方が与えられたら、適切な車両をリストアップする必要があります。Hibernateの例クエリ

例: 「Vehicle」というエンティティがあります。エンティティ名がMakeModelのmakeModelというプロキシがあります。 MakeModelは「作る」とエンティティ名モデルとMake.Both Entititiyes「モデル」であり「モデル」されているプロキシと「make」を持つ文字列変数「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; 
} 

ありましたかIであります車両リストを取得しようとしました。ここでは、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ではなく、Hibernateの基準を使ってすべての車両を取得したい。

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

+1

質問は?あなたが参照した答えは良い出発点です。何を試しましたか?そして、「私は問題を解決できませんでした」とはどういう意味ですか? – home

+0

これに対して適切な休止状態を取得することはそれほど難しいことではありませんが、VehicleおよびMakeModelエンティティのコードを提供することができればもっと簡単になります。 –

+0

@Home。ご注意いただきありがとうございます。質問はすべてのコードで編集されました。 –

答えて

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はOKですが、 'make '.. MakeModelだけではMakeModelがないので、 –

+0

上記のコメントを編集しました –

関連する問題