Я написал код гибернации с API-критерием, включающим несколько сущностей (имеющих родительско-дочерние отношения, и я использую createAlias () для объединения сущностей), ожидая получить только корневую сущность в результате.
Однако, когда я отлаживаю SQL, сгенерированный hibernate, я вижу, что hibernate извлекает данные (в предложении select) для всех сущностей, используемых в предложении соединения (достигается с помощью createAlias ()).
Я не думаю, что есть необходимость извлекать столбцы для другой сущности, отличной от ожидаемой корневой сущности, поскольку она может быть неэффективной, и я пытаюсь избежать этого?
Я использую Hibernate версии 3.6.9
Вот сценарий.Есть 3 объекта A, B & C, имеющие родительские и дочерние отношения следующим образом A (супер-родитель) -> B (родительский) -> C (дочерний)
session.createCriteria(B.class, "b")
.createAlias("b.c", "c",Criteria.INNER_JOIN)
.createAlias("b.a", "a",Criteria.INNER_JOIN)
.add(Restrictions.in("c.prop1c", <<some value>>))
.add(Restrictions.in("a.prop1a", <<some value>>))
criteria.list()
now when hibernate generates the SQL it looks like
select
b.all columns of B
a.all columns of A
c.all columns of C
from B b
inner join A a on b.prop=a.prop
inner join C C on b.prop=c.prop
where
c.prop1c = <<some value>>
a.prop1a = <<some value>>
, если вы видите, что hibernate сгенерировал запрос кизвлекать все столбцы всех объектов (A, B & C), однако на данный момент мне не нужен никакой объект, кроме корневого объекта (B), данные для таких объектов, как A & C, должны извлекаться позже в соответствии со стратегиями выборки ихсопоставления с B. Я думаю, что для этого запроса нет необходимости извлекать все данные по н / ж трафику, тем не менее hibernate генерирует такой запрос.
Есть ли способ, которым я могу направлять спящий режим только наполучить столбцы для объекта B, а не для A & C, используя критерии API?
select
b.all columns of B
from B b
inner join A a on b.prop=a.prop
inner join C C on b.prop=c.prop
where
c.prop1c = <<some value>>
a.prop1a = <<some value>>