Как ограничить Hibernate для генерации SQL-запросов со столбцами только из корневого объекта в Criteria API, включающего несколько объектов - PullRequest
0 голосов
/ 01 января 2019

Я написал код гибернации с 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>>

1 Ответ

0 голосов
/ 01 января 2019

Устаревшие Критерии устарели.Вы можете использовать JPA Criteria, который поддерживает это через директиву JOIN, а не FETCH.

Или использовать JPQL:

select b
from B b
inner join b.a. a
inner join b.a. c
where
c.prop1c = :prop1c 
a.prop1a = :prop1a
...