2012-05-08 2 views
0

Я объясню проблему с примером.
У меня есть объект Vehicle, который имеет название модели и марку. Когда марка указана, необходимо указать соответствующее транспортное средство. когда даны как марка, так и модель, следует указать подходящие транспортные средства.Hibernate Примеры запросов

Например: Существует объект под названием «Транспортное средство». У него есть прокси, называемый makeModel, чье имя Entity: MakeModel. MakeModel имеет прокси, которые «делают» и «модель», чья сущность названия модели и «Модель» Make.Both Entititiyes и «Make» имеют переменную типа String «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.

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.

Аналогичный вопрос можно найти here и указан this. Любой из нас дает мне знать, где не так, и как получить список транспортных средств в соответствии с заданными критериями.

+1

И вопрос в том, что? Ответ, на который вы ссылаетесь, является хорошей отправной точкой. Что вы пробовали? И что означает «я не могу решить проблему»? – home

+0

Получение подходящих критериев для спящего режима для этого не так сложно, но было бы намного проще, если бы вы могли предоставить код для объектов Vehicle и MakeModel. –

+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") к вашему методу, чтобы избежать просмотра непроверенных предупреждений о броске.

+0

Критерии возвращались список транспортных средств. Я только что написал последний комментарий неправильно. –

+0

Это дало мне длинные выходы стека. :(Я не эксперт и не понимаю эту точку вашего кода 'cr.createAlias ​​(« makeModel »,« makeModel ») .createAlias ​​(« make »,« make »)' set alias 'makeModel в порядке, но «make» .. потому что в Car только в MakeModel нет. –

+0

Вы правы. Я отредактировал мой комментарий выше. Проверьте это. –

Смежные вопросы