Hibernate по умолчанию присоединение для nullable многие-к-одному - PullRequest
12 голосов
/ 06 октября 2009

У меня есть отображение спящего режима, подобное этому, в классе 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 по умолчанию для выполнения внешнего соединения (потому что отношение является необязательным), поэтому я получил бы «null» для col2, а не строки вообще.

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

Спасибо.

1 Ответ

9 голосов
/ 06 октября 2009

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

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

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