Hibernate query a foreign key field with ID

Na przykład, mam dwa podmioty: pracownika i adres. Spośród tych elementów pracownik ma adres klucza obcego, który odwołuje się do kolumny ID na adresie. W obiektach domeny Java Hibernate ładnie otacza pole liczb całkowitych klucza fałsz z polem obiektu adresu. Ale jak mógłbym zapytać pracownika o konkretny adres?

Próbowałem utworzyć alias tabeli. To chyba działa, ale jest dość niezręczne.

Próbowałem też zrobić coś takiego:

criteria.add(restriction.eq("TheAddressObjectFieldName", 123);
To działa jakiś czas, ale nie zawsze. Nie jestem pewien, czy to jest właściwa droga, ale miałem nadzieję, że może cały czas.

Jaki jest więc właściwy sposób odpytywania kolumny klucza obcego w hibernate?

Author: o.k.w, 2009-11-24

2 answers

Hibernate "ładnie owija" tylko to, co każesz owijać. Zakładając więc, że Twoje Employee mapowanie wygląda mniej więcej tak:

@Entity
public class Employee {
  ...
  @ManyToOne
  @JoinColumn(name="address_id")
  private Address address;
  ...
}

A twoje Address ma właściwość id, możesz odpytywać na podstawie address_id poprzez:

session.createCriteria(Employee.class)
 .add(Restrictions.eq("address.id", addressId));

W celu zapytania na podstawie właściwości Address, musisz utworzyć aliasy lub zagnieżdżone kryteria:

session.createCriteria(Employee.class)
 .createAlias("address", "a")
 .add(Restrictions.eq("a.postalCode", postalCode));
 68
Author: ChssPly76,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-24 01:04:36

Mam podobne problemy... @ChssPly76 odpowiedź działa dobrze, ale właśnie znalazłem rozwiązanie jeśli klucz obcy nie jest częścią Id w tabeli nadrzędnej - musisz zmodyfikować adnotację dodając "referencedColumnName":

@ManyToOne
@JoinColumn(name="address_id", referencedColumnName="addrUniqueFieldName")
private Address address;

I wtedy możesz utworzyć kryteria:

criteria.add(restriction.eq("address.addrUniqueFieldName", 123);
 2
Author: Helija,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-22 17:17:02