JPA выбирает новый конструктор, вызывает дополнительные выборки - PullRequest
3 голосов
/ 27 февраля 2012

У меня сложная проблема JPA / Hibernate. У меня есть две сущности A и B. Ссылки A B, но эта связь не требуется.

public class A {

@JoinColumn(name = "b_id", referencedColumnName = "b_id")
@OneToOne
private B b;

}

Я пишу SELECT NEW dto(a.b) FROM A a это генерирует внутреннее соединение, что не очень хорошо для меня, потому что a.b может быть нулевым, и я хочу все объекты A. Поэтому я переписываю свой запрос следующим образом: SELECT NEW dto(b) FROM A a LEFT JOIN B b Мы должны использовать псевдоним (b), чтобы предотвратить внутреннее соединение и получить только внешнее соединение. Хорошо, я получаю всю строку, но я получаю дополнительные запросы, Hibernate генерирует запросы SELECT для всех сущностей B. Почему, как я могу остановить это, я использую левое соединение, потому что я хочу только один запрос.

Edit:

Та же проблема с внутренними соединениями. Если используется SELECT NEW dto(a.b) FROM A a, происходит дополнительное SELECT b FROM B b WHERE b.id = ?, но если я звоню SELECT NEW dto(a.b.id) FROM A a, дополнительный выбор для энтузиастов B отсутствует.

Edit2:

Это точно так же, как моя проблема: Та же проблема, без возможного решения.

Поскольку я не загружаю сам родительский объект, Hibernate не загружается с нетерпением B ...

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

вы хотите, чтобы Bs ссылались на A, и поскольку вы используете hql:

SELECT NEW dto(b) FROM A a LEFT JOIN a.b b
0 голосов
/ 01 апреля 2012

Теперь я знаю, в чем причина проблемы, и знаю решение.

частично решение заключается в использовании метода hibernate setResultTransformer. К сожалению, JPA не поддерживает это ...

...