2013-12-12 3 views
1

У меня есть две таблицы; Люди и домашние животные.Выполнение подобного запроса для объекта, содержащего объект

Люди

PERSON_ID PERSON_NAME FAVORITE_PET 
1,   Ryan,  1 

Домашние животные

PET_ID PET_NAME  
1,  Binky 

Человек может или не может иметь любимое домашнее животное.

Я хотел бы вернуть всех людей, у которых есть любимое домашнее животное с таким именем, как «binky».

В SQL я хотел бы сделать следующее: -

SELECT * 
    FROM people people, pets pet 
WHERE people.favorite_pet = pet.pet_id 
    AND pet.pet_name LIKE 'binky'; 

Я сопоставляются мои классы ниже: -

класса

Person

@Entity 
@Table(name = "people") 
public class Person implements Serializable { 

    @Id @Column(name = "person_id") private long personId; 
    @Column(name = "person_name") private long personName; 
    @JoinColumn(name = "favorite_pet") @ManyToOne private Pet favoritePet; 

} 
класса

Pet

@Entity 
@Table(name = "pets") 
public class Pet implements Serializable { 

    @Id @Column(name = "pet_id") private long petId; 
    @Column(name = "pet_name") private String petName; 

} 

Чтобы вернуть эквивалентный запрос я бы ожидать, чтобы сделать следующее: DetachedCriteria -

DetachedCriteria criteria = DetachedCriteria.forClass(Person.class); 
criteria.add(Restrictions.like("favoritePet.petName", "binky")); 

Однако, когда я делаю это, я получаю следующее сообщение об ошибке: -

org.hibernate.QueryException: could not resolve property: favoritePet.petName of: 
com.test.Person 

Что такое правильный подход делает такой запрос с использованием ограничений?

+1

Так же, как нет te, ваша схема неверна для данных этого типа, таблица Pet должна иметь OWNER_ID, для таблицы Owner не требуется OWNED_PET. В противном случае вы будете бороться с владельцами всего, кроме одного питомца (возможно, 0, если вы используете NULL). Если вы хотите разрешить домашним животным иметь несколько владельцев, вам нужна третья таблица для обработки ссылок Pet_ID/Owner_ID. –

+0

Для некоторой ясности я решил использовать концепцию любимого домашнего животного, а не принадлежащего домашнему животному. То, о чем вы упомянули выше, на самом деле не является основной проблемой, это действительно просто пример. – VeasMKII

ответ

0

Я не знаю, почему вы используете Criteria API для такого простого статического запроса, вместо простого HQL запросов:

select person from Person person where person.favoritePet.name like :name 

Это создает неявный внутреннее соединение, и эквивалентно

select person from Person person 
inner join person.favoritePet pet 
where pet.name like :name 

И, таким образом, также необходимо дзёи, если вы (действительно) хотят сделать это с помощью критериев запроса:

Criteria c = session.createCriteria(Person.class, "person"); 
c.createLias("person.favoritePet", "pet"); // inner join 
c.add(Restrictions.like("pet.name", name)); 
Смежные вопросы