Hibernate: Как выбрать один элемент на основе столбца внешнего ключа, который является частью сопоставления ассоциации? - PullRequest
4 голосов
/ 12 июня 2011

Алло, Итак ... У меня есть следующие объекты:

public class Person {
   // some other getters/setters omitted.
   void setAddress(Address addy) {
       // omitted
   }

   Address getAddress() {
       // omitted
   }
}

public class Address {
   Integer getId() {
      // omitted
   }
}

И у меня есть следующие спящие отображения:

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>

    <many-to-one name="address" 
        column="addressId" 
        unique="true"
        not-null="true"/>
</class>

<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
</class>

Таким образом, существует сопоставление один-к-одному от Person до Address, Person имеет внешний ключ к Address.


Я пытаюсь извлечь Person объект из заданного Address ID ... но я не могу понять правильный синтаксис HQL:

public Person getPersonFromAddress(Address address) {

    Query query = this.session.createQuery("select p from Person as p where p.address_id = " + address.getId());

    @SuppressWarnings("unchecked")
    Person p = (Person)query.uniqueResult();

    return p;
}

Я знаю, что у меня нет сопоставления столбца внешнего ключа со свойством Person. Каждый раз, когда я пытаюсь добавить один, я получаю исключение, говорящее, что я использую один и тот же столбец дважды? Я не вижу, что было бы не так с этим:).

В любом случае, каков будет лучший способ получить Человека с данным адресом? Любая помощь будет оценена.

1 Ответ

8 голосов
/ 12 июня 2011

Вы должны быть в состоянии сделать это

Query query = this.session.createQuery("select p from Person as p where p.address=:address")
            .setParameter("address",address); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...