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

Присоединение по умолчанию к гибернату для обнуления "много-к-одному"

У меня есть сопоставление спящего режима, подобное этому в классе ProductDfn

@ManyToOne( fetch = FetchType.LAZY, optional = true )
@JoinColumn( name = "productTypeFk", nullable = true )
public ProductType getProductType()
{
    return productType;
}

Обратите внимание, что связь определяется как необязательная (и столбец имеет значение NULL).

При выполнении HQL что-то вроде этого

select p.name as col1, p.productType.name as col2 from ProductDfn p

Внутреннее соединение используется для присоединения ProductDfn к ProductType, поскольку hibernate генерирует явное соединение SQL из неявного соединения в предложении select.

Однако при выполнении вышеуказанного, когда productType имеет значение null (в БД), никакая строка не возвращается из-за внутреннего соединения. Для этой связи я хотел бы иметь hibernate default для выполнения внешнего соединения (потому что отношение не является обязательным), поэтому я бы получил "нулевой" ответ для col2, а не никакой строки вообще.

Кто-нибудь знает, возможно ли это?

Спасибо.

4b9b3361

Ответ 1

Внутреннее соединение используется, потому что вы явно указали p.productType.name в своем предложении select. Это не произошло бы, если бы вы просто выбрали ProductDfn, так как для вашей выборки установлено значение LAZY.

Если вам нужно только восстановить эти два свойства, вам нужно будет явно указать внешнее соединение в вашем запросе:

select p.name as col1, ptype.name as col2
  from ProductDfn p
  left join fetch p.productType ptype