У меня есть две таблицы; Люди и домашние животные.Выполнение подобного запроса для объекта, содержащего объект
Люди
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
Что такое правильный подход делает такой запрос с использованием ограничений?
Так же, как нет te, ваша схема неверна для данных этого типа, таблица Pet должна иметь OWNER_ID, для таблицы Owner не требуется OWNED_PET. В противном случае вы будете бороться с владельцами всего, кроме одного питомца (возможно, 0, если вы используете NULL). Если вы хотите разрешить домашним животным иметь несколько владельцев, вам нужна третья таблица для обработки ссылок Pet_ID/Owner_ID. –
Для некоторой ясности я решил использовать концепцию любимого домашнего животного, а не принадлежащего домашнему животному. То, о чем вы упомянули выше, на самом деле не является основной проблемой, это действительно просто пример. – VeasMKII