Hibernate:如何根据作为关联映射一部分的外键列选择单个项目?

Pol*_*878 4 java hibernate hibernate-mapping

Hullo,所以...我有以下对象:

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

   Address getAddress() {
       // omitted
   }
}

public class Address {
   Integer getId() {
      // omitted
   }
}
Run Code Online (Sandbox Code Playgroud)

而且,我有以下hibernate映射:

<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>
Run Code Online (Sandbox Code Playgroud)

因此,有一对一的映射,从PersonAddress,Person有外键Address.


我要做的是Person从给定的AddressID中获取一个对象 ......但我似乎无法弄清楚正确的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;
}
Run Code Online (Sandbox Code Playgroud)

我知道我没有从外键列到Person上的属性的映射.每次我尝试添加一个我得到一个异常,说我使用相同的列两次?我不明白那会是什么问题:).

无论如何,获取给定地址的人最好的方法是什么?任何帮助,将不胜感激.

Ale*_*man 8

你应该能够做到这一点

Query query = this.session.createQuery("select p from Person as p where p.address=:address")
            .setParameter("address",address); 
Run Code Online (Sandbox Code Playgroud)

  • @ Polaris878`p.address.id =:addressId`其中`id`是id属性的名称.祝好运! (3认同)
  • 嘿亚历克斯,谢谢你确实工作:).如果我只有地址ID怎么办?在获取`Person`之前,我是否必须先将其解析为加载Hibernate的`Address`? (2认同)