Присоединение по умолчанию к гибернату для обнуления "много-к-одному"
У меня есть сопоставление спящего режима, подобное этому в классе 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, а не никакой строки вообще.
Кто-нибудь знает, возможно ли это?
Спасибо.
Ответы
Ответ 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