Hibernate запрашивает поле внешнего ключа с идентификатором
Например, у меня есть два объекта: Employee и Address. Из этих enitities, Employee имеет внешний ключ AddressID ссылается на столбец ID в адресе. В объектах домена Java Hibernate красиво обертывает поле целочисленного ключа forgein с полем "Адрес объекта". Но теперь, как я могу запросить Employee с определенным AddressID?
Я попытался создать псевдоним таблицы. Кажется, это работает, но это довольно неудобно.
Я также попытался сделать что-то вроде этого:
criteria.add(restriction.eq("TheAddressObjectFieldName", 123);
Это работает некоторое время, но не всегда. Я не уверен, что это правильный путь, но я надеялся, что это все время.
Итак, каков правильный способ запроса по столбцу внешнего ключа в спящем режиме?
Ответы
Ответ 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);