Критерии гибернации с проекцией, не выполняющей запрос для отображения @OneToMany - PullRequest
4 голосов
/ 11 января 2011

У меня есть доменный объект Expense, в котором есть поле с именем initialFields .

. Оно помечено так:

@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
@JoinTable(blah blah)
private final List<Field> initialFields;

Теперь я пытаюсьиспользуйте Projection для извлечения только определенных полей из соображений производительности, но при этом поле initialFields всегда имеет значение null.Это единственное поле OneToMany и единственное поле, которое я пытаюсь получить с помощью проекции, которая ведет себя таким образом.Если я использую обычный запрос HQL, поля initialFields заполняются соответствующим образом, но, конечно, я не могу ограничить поля.

Код частичной проекции:

Criteria criteria = session.createCriteria(Payment.class);
criteria.createAlias("expense", "e");

ProjectionList properties = Projections.projectionList();
//Some restrictions and more fields
properties.add(Projections.property("e.initialFields"), "initialFields");
criteria.setProjection(properties);
criteria.setFetchMode("e.initialFields", FetchMode.JOIN);
criteria.setReadOnly(true);
criteria.setResultTransformer(Transformers.aliasToBean(Expense.class));

return criteria.list();

Когда я включаю отладку и включаюпокажите sql, запрос на получение initialFields не создается / запускается.Кто-нибудь когда-либо видел что-нибудь подобное?

Я только что попытался использовать проекцию HQL, указав каждое поле, которое я хочу вытащить, а затем вручную создав объект.В этом случае SQL, созданный Hibernate, неверен для поля initialFields.expense1_.name as col_1_0_, . as col_2_0_, expense1_.account_id as col_3_0_.. as col_2_0_ is, где будут извлечены начальные поля.Я предполагаю, что это должно быть expense1_.id as col_2_0_.

Редактировать: я просто удалил Result Transformer для проверки каждого свойства, и свойство initialFields действительно равно нулю.

1 Ответ

3 голосов
/ 16 марта 2011

У меня была похожая проблема, и я работал, явно указав joinType в критериях.

Criteria criteria = session.createCriteria(Payment.class);
criteria.createAlias("expense", "e", CriteriaSpecification.LEFT_JOIN);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...