Выберите HQL, когда объекты отображаются с помощью аннотаций

У меня есть один вопрос о HQL. Предположим, у меня есть две таблицы. Например, таблица «Персона» и таблица «Мобильный номер». Один человек много мобильных номеров. Отношение @OneToMany.

В моем классе Person.java, который является сущностью, у меня есть несколько полей, и одно из полей

List<MobileNumber> mobiles; // (list of mobile numbers). 

Проблема в следующем: я хочу получить доступ в HQL к одному из полей класса MobileNumber.java. Нравится :

Query = EntityManager.createQuery("select p.someField from Person where p.mobiles.someField = "value" );

Объект MobileNumber сопоставляется с объектом Person. Как я уже упоминал, отношение OneToMany и Person содержит список MobileNumbers. Это не проблема, если отношение OneToOne или ManyToOne, потому что в этом случае объект Person содержит только один объект MobileNumber.

Заранее спасибо.


person Chala    schedule 22.09.2013    source источник


Ответы (1)


Вы можете JOIN на другом объекте

SELECT mobile.someField 
FROM Person person 
JOIN person.mobiles mobile 
WHERE mobile.someField = "value"

Подробнее об этом читайте в документации.

person Sotirios Delimanolis    schedule 22.09.2013
comment
Спасибо, но я не использую оператор JOIN. Вместо этого я использую аннотации. - person Chala; 22.09.2013
comment
@Chala Вы используете HQL. Вам нужно использовать правильный синтаксис HQL для достижения вашей цели. Этот вариант использования не имеет ничего общего с аннотациями. - person Sotirios Delimanolis; 22.09.2013
comment
Ничего, если я использую аннотации с этим утверждением? - person Chala; 22.09.2013
comment
@chala Как я уже сказал, для этого конкретного варианта использования не существует понятия аннотаций. Если вы хотите получить доступ к полю объекта, сопоставленному с @OneToMany, вам нужно использовать JOIN. Я не понимаю, почему ты не хочешь. - person Sotirios Delimanolis; 22.09.2013
comment
Кроме того, достаточно ли оператора JOIN или нужен тип соединения? - person Chala; 22.09.2013
comment
@Chala Когда вы указываете только JOIN, это неявно делает INNER JOIN. Прочитайте связанную документацию. Это все должно быть там. - person Sotirios Delimanolis; 22.09.2013
comment
У меня есть еще один вопрос. У меня есть два объекта: Группа и День. Объект Day сопоставляется с Group. В аннотации объекта Group есть @ManyToOne, и этот объект содержит объект Day. Я хочу вставить в базу данных объект группы, но когда я пытаюсь это сделать, я получаю исключение, потому что в параметре метода не объект Day, а таблица Primary Key of Day. Что я могу сделать ? - person Chala; 23.09.2013
comment
@Chala Я рекомендую вам опубликовать еще один вопрос. Я не могу представить это так. И опубликуйте все свое исключение. - person Sotirios Delimanolis; 23.09.2013
comment
Могу ли я написать несколько объединений? Например: ВЫБЕРИТЕ mobile.someField FROM Person person ПРИСОЕДИНЯЙТЕСЬ к person.mobiles mobile ПРИСОЕДИНЯЙТЕСЬ к person.emails email ГДЕ mobile.someField = значение и email.someField = значение - person Chala; 23.10.2013
comment
@Chala Да, если это сопоставленные объекты. - person Sotirios Delimanolis; 23.10.2013
comment
ВЫБЕРИТЕ mobile.someField FROM Person person ПРИСОЕДИНЯЙТЕСЬ к person.mobiles mobile ПРИСОЕДИНЯЙТЕСЬ к person.emails email ГДЕ mobile.someField = значение и email.someField = значение правильный ли синтаксис? - person Chala; 23.10.2013
comment
@Chala Кажется, это правильно. Поля должны иметь те же имена, что и поля в ваших сущностях. - person Sotirios Delimanolis; 23.10.2013