Подтвердить что ты не робот

Hibernate запрашивает поле внешнего ключа с идентификатором

Например, у меня есть два объекта: Employee и Address. Из этих enitities, Employee имеет внешний ключ AddressID ссылается на столбец ID в адресе. В объектах домена Java Hibernate красиво обертывает поле целочисленного ключа forgein с полем "Адрес объекта". Но теперь, как я могу запросить Employee с определенным AddressID?

Я попытался создать псевдоним таблицы. Кажется, это работает, но это довольно неудобно.

Я также попытался сделать что-то вроде этого:

criteria.add(restriction.eq("TheAddressObjectFieldName", 123);

Это работает некоторое время, но не всегда. Я не уверен, что это правильный путь, но я надеялся, что это все время.

Итак, каков правильный способ запроса по столбцу внешнего ключа в спящем режиме?

4b9b3361

Ответ 1

Спящий режим "красиво обертывает" только то, что вы говорите, чтобы обернуть. Итак, предположим, что ваше сопоставление Employee выглядит примерно так:

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

и ваш Address имеет свойство id, вы можете запросить на основе address_id через:

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

Чтобы запросить на основе свойств Address, вам нужно создавать псевдонимы или вложенные критерии:

session.createCriteria(Employee.class)
 .createAlias("address", "a")
 .add(Restrictions.eq("a.postalCode", postalCode));

Ответ 2

Схожие проблемы... @ChssPly76 ответ работает отлично, но только что нашел решение, если внешний ключ не является частью идентификатора в родительской таблице - вы должны изменить аннотацию, добавив "referencedColumnName":

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

а затем вы можете создать критерии:

criteria.add(restriction.eq("address.addrUniqueFieldName", 123);