У меня есть следующие 3 класса:
public class Object {
...whatever
}
public class CustomerObject {
@OneToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "OBJECT_ID", referencedColumnName = "OBJECT_ID", insertable = false, updatable = false)
private Object object;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CUSTOMER_TYPE_ID", referencedColumnName = "OBJECT_ID", insertable = false, updatable = false)
private CustomerTypeObject customerTypeObject;
}
public class CustomerTypeObject {
@JoinColumn(name = "OBJECT_ID", referencedColumnName = "OBJECT_ID", insertable = false, updatable = false)
@OneToOne(optional = false, fetch = FetchType.LAZY)
private Object object;
}
Когда я делаю это:
entityManager.createQuery(
"select cust from CustomerObject cust "
+ "left join fetch cust.customerTypeObject customerType "
+ "where cust.id = :customer_id
, CustomerObject.class)
.setParameter("customer_id", BigDecimal.valueOf(1))
.getSingleResult();
Hibernate выдает 1 запрос, чтобы получить клиента с его customerType, но затем он также выдает запрос, чтобы получить объектную ассоциацию в объекте CustomerTypeObject. Проблема устранена (то есть выполнен только один запрос) путем объединения, извлекающего эту связь:
entityManager.createQuery(
"select cust from CustomerObject cust "
+ "left join fetch cust.customerTypeObject customerType "
+ "left join fetch customerType.object customerTypeObject "
+ "where cust.id = :customer_id
, CustomerObject.class)
.setParameter("customer_id", BigDecimal.valueOf(1))
.getSingleResult();
но я не хочу этого делать. Нет ли способа сделать это? (т. е. не нужно охотно извлекать ассоциацию OneToOne в сущности, которая уже соединена, извлекается в запросе).