У меня есть доменный объект 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 действительно равно нулю.